„‘Jeder soll privat #gendern wie er will, aber ich möchte mich nicht im öffentlich-rechtlichen Rundfunk mit moralischem Zeigefinger belehren lassen, wie ich zu sprechen habe. Wer gibt gebührenfinanzierten Redakteuren das Recht, dafür Anpassungsdruck zu erzeugen?‘ (tm) #Merz #Lanz“ – so lautet ein Tweet von CDU-Politiker Friedrich Merz vom 07.05.2021.

Über das Gendern in der Sprache wird aktuell hitzig diskutiert. Anstelle des generischen Maskulinums werden dabei zur Gleichstellung der Geschlechter entweder alle tatsächlich gemeinten Geschlechter aktiv genannt oder geschlechtsneutrale Begriffe verwendet. Das Beispiel von Friedrich Merz zeigt, dass nicht jede*r mit dieser sprachlichen Anpassung einverstanden ist.

Auch in anderen Bereichen bleibt die fehlende Gleichstellung relevant: Laut Statistischem Bundesamt haben Frauen im Jahr 2020 durchschnittlich 18% weniger Bezahlung erhalten als Männer. Und der Anteil von Frauen in Aufsichtsräten von Unternehmen, die keiner festen Quotenregelung unterliegen, beträgt aktuell nur 19,9% (BMFSFJ).

Die genannten Beispiele zeigen die Aktualität des Themas, weshalb im Rahmen dieses Projekts unterschiedliche Datenanalysen und -visualisierungen durchgeführt wurden, welche sich alle um das Thema Gender in der Politik drehen.

Um zu untersuchen, wie sich die Frauenquote bei den Vertreter:innen der Gesellschaft darstellt, wurde zunächst eine Analyse der Geschlechterverteilung der Fraktionen im Bundestag und in den Landtagen durchgeführt. Außerdem wurde die Geschlechterverteilung der Landtage ohne Fraktionsbezug pro Bundesland untersucht, um einen Ländervergleich zu ermöglichen. Basis für diese Auswertung war der aktuelle DBoeS-Datensatz von “2020 Leibniz-Institut für Medienforschung | Hans-Bredow-Institut” über deutsche Politiker*innen. (Link zum Datensatz: https://github.com/Leibniz-HBI/DBoeS-Automatization/blob/master/LICENSE)

Außerdem wurden Tweets von Politiker*innen zum Thema Gender als Grundlage für eine Sentiment-Analyse verwendet.

Dieser Twitter-Datensatz wurde abschließend eingesetzt, um eine Netzwerkanalyse durchzuführen: Dargestellt wird, welche Politiker*innen durch Retweets miteinander vernetzt sind und sich so aufeinander beziehen.

Load libraries

library(tidytext) 
library(tidyverse)
library(quanteda)
library(lubridate)
library(ggplot2)
library(plotly)
library(forcats)
library(readxl)
library(leaflet)
library(leaflet.minicharts)
library(sp)
library(sf)
library(readr)
library(stringr)
library(rtweet)
library(ggraph)
library(ggrepel)
library(tidygraph)

Load Data

Parlamentarier <- read_csv("Data/Parlamentarier.csv")

EU-Parlament rausfiltern

Parlamentarier <- Parlamentarier %>% 
  filter(Kategorie!="EU-Parlament")

Read Tabellen mit fehlenden Geschlechtern

alle_geschlechter <- read_excel("Data/Parlamentarier_geschechter.xlsx", sheet = "Geschlechter")

Join fehlende Geschlechterangaben

Parlamentarier <- Parlamentarier %>% 
  left_join(alle_geschlechter, by = c("Name" = "Name"))

Rename Spalten

Parlamentarier <- Parlamentarier %>% 
  rename(Geschlecht = Geschlecht.y)

Bundestag Geschlechterverteilung pro Partei

bundestag <- Parlamentarier %>% 
  select(id, Name, Geschlecht, Partei, Kategorie, SM_Twitter_id, SM_Twitter_user) %>% 
  filter(Kategorie=="Bundestag")

bundestag$Partei[bundestag$Partei == "CSU"] <-"CDU/CSU"
bundestag$Partei[bundestag$Partei=="CDU"]<-"CDU/CSU"

bundestag_man <- bundestag %>% 
  group_by(Partei) %>% 
  filter(Geschlecht == "männlich") %>% 
  summarise(gesamt_man=n())

bundestag_gesamt <- bundestag %>% 
  group_by(Partei) %>% 
  filter(Geschlecht == "weiblich") %>% 
  summarise(gesamt_frau=n()) %>% 
  left_join(bundestag_man) %>% 
  mutate(row_sum=rowSums(.[2:3])) %>% 
  arrange(desc(row_sum))

Balkendiagramm: Geschlechterverteilung im Bundestag

plot_ly(data=bundestag_gesamt, x=~reorder(Partei,-row_sum), y=~gesamt_frau, name="weiblich", marker=list(color=toRGB("#FB7F62")),
        type="bar", hoverinfo="text", text=~paste("",row_sum), 
        hovertemplate=paste("Anzahl: %{y:,.0f}", 
                            "<br>Gesamtanzahl: %{text}")) %>% 
  add_trace(y=~gesamt_man, name="männlich", marker=list(color=toRGB("#775285"))) %>% 
  layout(barmode="stack", title="Geschlechterverteilung in den Parteien im Bundestag", # titel position und größe ändern
         xaxis = list(title = ""), yaxis=list(title="Anzahl Abgeordnete")) %>%
  layout(legend=list(x=1, y=0.5))

Landtag Geschlechterverteilung pro Partei

  • filtern allen Landtagen
  • CDU & CSU sowie FDP & DVP zusammenfügen
  • nach männlich und weiblich gruppieren, Anzahl berechnen und sortieren
landtag_partei <- Parlamentarier %>% 
  filter(Kategorie !="Bundestag") %>% 
  filter(Kategorie!="EU-Parlament") %>% 
  filter(Partei !="BIW") %>% 
  filter(Partei!="SSW") %>% 
  filter(Partei!="BVB/FW") %>% 
  filter(Partei!="FW")
landtag_partei$Partei[landtag_partei$Partei == "CSU"] <-"CDU/CSU"
landtag_partei$Partei[landtag_partei$Partei=="CDU"] <- "CDU/CSU"
landtag_partei$Partei[landtag_partei$Partei=="FDP/DVP"] <- "FDP" 
landtag_man <- landtag_partei %>% 
  group_by(Partei) %>% 
  filter(Geschlecht=="männlich") %>% 
  summarise(gesamt_man=n())

landtag_gesamt <- landtag_partei %>% 
  group_by(Partei) %>% 
  filter(Geschlecht=="weiblich") %>% 
  summarise(gesamt_frau=n()) %>% 
  left_join(landtag_man) %>% 
   mutate(row_sum=rowSums(.[2:3])) %>% 
  arrange(desc(row_sum))

Balkendiagramm: Geschlechterverteilung in den Landtagen

plot_ly(data=landtag_gesamt, x=~reorder(Partei,-row_sum), y=~gesamt_frau, name="weiblich", marker=list(color=toRGB("#FB7F62")), 
        type="bar", hoverinfo="text", text=~paste("",row_sum), 
        hovertemplate=paste("Anzahl: %{y:,.0f}", 
                            "<br>Gesamtanzahl: %{text}")) %>% 
  add_trace(y=~gesamt_man, name="männlich", marker=list(color=toRGB("#775285"))) %>% 
  layout(barmode="stack", title="Geschlechterverteilung in den Parteien in den Landtagen", # titel position und größe ändern
         xaxis=list(title=""), yaxis=list(title="Anzahl Abgeordnete")) %>%
  layout(legend=list(x=1, y=0.5))

Balkendiagramme: Geschlechterverteilung

Die beiden Balkendiagramme zeigen die aktuelle fraktionsbezogene Geschlechterverteilung in der deutschen Politik – einmal in Bezug auf den Bundestag und einmal hinsichtlich der Landtage. Im zweiten Fall wurden die Abgeordneten aller Landtage addiert, um so einen durchschnittlichen Gesamtüberblick zu ermöglichen.

Für eine bessere Vergleichbarkeit konzentrieren sich beide Darstellungen auf ihre gemeinsame Schnittmenge der Fraktionen. So wird beispielsweise die SSW nicht aufgeführt, da sie nur im Schleswig-Holsteinischen Landtag agiert.

Fraktionen, die in bestimmten Ländern andere Bezeichnungen haben, wurden zusammengefasst (CDU/CSU und FDP/DVP zu FDP).

Im verwendeten Datensatz lagen zwar Informationen zum Geschlecht vor, diese waren jedoch lückenhaft. Fehlende Geschlechtsangaben wurden manuell hinzugefügt, wobei vom üblichen Genus des Namens auf das Geschlecht geschlossen wurde.

Die Höhe der Balken gibt jeweils an, wie viele Abgeordnete die jeweilige Fraktion hat. Der lilafarbene Teil jedes Balkens zeigt die Anzahl der männlichen, der orangene Balken die Zahl der weiblichen Abgeordneten. Hovert man über die Balken, wird die jeweils geschlechtsbezogene Anzahl sowie die Gesamtanzahl der Abgeordneten angezeigt, um eine Einschätzung des Anteils zu ermöglichen.

Es ist erkennbar, dass die AfD sowohl in den Landtagen als auch im Bundestag deutlich mehr männliche Abgeordnete stellt. Eine ebenso auffällige Ungleichheit ist bei der FDP und CDU/CSU zu sehen.

Nahezu ausgeglichen ist dagegen die SPD im Bundestag, ebenso wie Die Linke in den Landtagen. Im Bundestag gibt es bei Die Linke sowie bei den Grünen mehr weibliche als männliche Abgeordnete.

Karte mit Geschlechterverteilung in den Landtagen

  • Alle Landtage herausfiltern
parlamentarier_landtag <- Parlamentarier %>% 
  filter(Kategorie %in% c("Abgeordnetenhaus von Berlin", 
                          "Bayerischer Landtag", 
                          "Bremische Bürgerschaft", 
                          "Hamburgische Bürgerschaft", 
                          "Hessischer Landtag", 
                          "Landtag Brandenburg", 
                          "Landtag des Saarlandes", 
                          "Landtag Mecklenburg-Vorpommern", 
                          "Landtag Nordrhein-Westfalen", 
                          "Landtag Rheinland-Pfalz", 
                          "Landtag Sachsen-Anhalt", 
                          "Landtag von Baden-Württemberg", 
                          "Niedersächsischer Landtag", 
                          "Sächsischer Landtag", 
                          "Schleswig-Holsteinischer Landtag", 
                          "Thüringer Landtag"))
  • Vektoren und Dataframe erstellen mit den Koordinaten an denen die späteren Pie-Charts fixiert werden sollen. (Immer genau im Mittelpunkt des Bundeslandes)
Kategorie <- c("Abgeordnetenhaus von Berlin", 
               "Bayerischer Landtag", 
               "Bremische Bürgerschaft",
               "Hamburgische Bürgerschaft", 
               "Hessischer Landtag",
               "Landtag Brandenburg", 
               "Landtag des Saarlandes",
               "Landtag Mecklenburg-Vorpommern",
               "Landtag Nordrhein-Westfalen",
               "Landtag Rheinland-Pfalz",
               "Landtag Sachsen-Anhalt", 
               "Landtag von Baden-Württemberg", 
               "Niedersächsischer Landtag", 
               "Sächsischer Landtag", 
               "Schleswig-Holsteinischer Landtag", 
               "Thüringer Landtag")

lat <- c(52.520008,
         48.917431,
         53.074982,
         53.553815,
         50.652052,
         52.408418,
         49.396423,
         53.612651,
         51.433237,
         50.118346,
         51.950265,
         48.661604,
         52.636704,
         51.104541,
         54.219367,
         51.010989)

lng <- c(13.404954,
         11.407980,
         8.807080,
         9.991575,
         9.162438,
         12.562492,
         7.022961,
         12.429595,
         7.661594,
         7.308953,
         11.692274,
         9.350134,
         9.845077,
         13.201738,
         9.696117,
         10.845346)

bundeslaender_koordinaten <- data.frame(Kategorie, lat, lng)
  • Dataframe nach Anzahl der männlichen und weiblichen Politiker*innen pro Bundesland filtern.
parlamentarier_man <- parlamentarier_landtag %>% 
  group_by(Kategorie) %>% 
  filter(Geschlecht == "männlich") %>% 
  summarise(männlich = n())

parlamentarier_landtag_gesamt <- parlamentarier_landtag %>% 
  group_by(Kategorie) %>% 
  filter(Geschlecht == "weiblich") %>% 
  summarise(weiblich = n()) %>% 
  left_join(parlamentarier_man)
  • Koordinaten der späteren Pie-Charts zur Haupttabelle joinen
parlamentarier_koordinaten <- parlamentarier_landtag_gesamt %>% 
  left_join(bundeslaender_koordinaten, by = c("Kategorie" = "Kategorie"))

Karte mit Tortendiagramm zur Geschlechterverteilung

  • geschlechterneutrale Farben für die Geschlechterverteilung erstellen, sowie die Grenzen der Bundesländer importieren und mit Namen versehen (popup).
colors <- c("#FB7F62", "#775285")

grenzen <- readRDS("Data/gadm36_DEU_1_sp.rds") %>% 
  st_as_sf()

popup_bundeslaender <- paste0("<strong>Bundesland: </strong>", grenzen$NAME_1)
  • Pie-Charts mit Hilfe von addMinicharts zur Karte angefügt.
map <- leaflet() %>% 
  addProviderTiles(providers$CartoDB.VoyagerLabelsUnder) %>% 
  setView(lng = 10.451526, lat = 51.165691, zoom = 5.5) %>% 
  addPolygons(data = grenzen,
              fillColor = "grey",
              fillOpacity = 0.1,
              weight = 3,
              color = "grey",
              popup = popup_bundeslaender) %>% 
  addMinicharts(
    parlamentarier_koordinaten$lng, parlamentarier_koordinaten$lat,
    type = "pie",
    chartdata = parlamentarier_koordinaten[, c("weiblich", "männlich")],
    colorPalette = colors,
    width = 46,
    height = 46,
    opacity = 0.8,
    legendPosition = "bottomright"
  )
sf layer has inconsistent datum (+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs).
Need '+proj=longlat +datum=WGS84'
map

Karte mit Geschlechterverteilung in den Landtagen

Die auf der Deutschlandkarte abgebildeten Torten-Diagramme veranschaulichen die Sitzverteilung der Abgeordneten in den deutschen Landesparlamenten aufgeschlüsselt nach der Geschlechterzugehörigkeit (männlichen Abgeordnete, weiblichen Abgeordnete).

Dabei wurde, um den Aspekt der landesspezifischen, aber deutschlandweiten Geschlechterrepräsentanz hervorzuheben, die Fraktionszugehörigkeit der Abgeordneten in der Darstellung nicht berücksichtigt.

Zunächst fällt auf, dass in allen Landesparlamenten mehr männliche Abgeordnete als weibliche Abgeordnete sitzen. Beinahe in jedem Landtag bewegt sich diese ungleiche Sitzverteilung zwischen einer zweidrittel - bis zu einer dreiviertel- Mehrheit an männlichen Abgeordneten.

Einzig die Hamburgische Bürgerschaft weist annähernd ein ausgeglichenes 1-zu-1-Verhältnis zwischen männlichen und weiblichen Abgeordneten auf, wenngleich auch hier die Anzahl der männlichen Abgeordneten leicht überwiegt. Am größten ist die Unausgeglichenheit in Sachsen-Anhalt mit 46 weiblichen Abgeordneten und 83 männlichen Abgeordneten.

Tweets der Politiker*innen scrapen

Nicht als ausführbaren Code, damit die Daten nicht nochmals gezogen werden…

Twitter_accounts <- Parlamentarier %>% filter(Kategorie!=“EU-Parlament”) %>% filter(Partei!=“BIW”) %>% filter(Partei!=“SSW”) %>% filter(Partei!=“BVB/FW”) %>% filter(Partei!=“FW”) %>% filter(Partei!=“fraktionslos”) %>% filter(SM_Twitter_user != "")

token <- get_token() token

alle_tweets <- list() userIdList = list(Twitter_accounts\(SM_Twitter_user) rl <- rate_limit(token, "statuses/user_timeline") for(user in userIdList[[1]]){ alle_tweets[[user]] <- get_timeline(user, n = 2, check = F) print("rate limit remaining:", str(rl\)remaining)) print(“at user:”, str(user)) rl <- rl %>% mutate(remaining = remaining - 1) # if rate limit exhausted, then wait to rate limit reset if (rl\(remaining == 5L) { rl <- rate_limit(token, "statuses/user_timeline") print("rate limit exceeded, waiting for 900s at user", str(user)) Sys.sleep(as.numeric(rl\)reset, “secs”)) } }

Nach relevanten Hashtags filtern

  • “alle_tweets.rds” ist die Datei mit allen gezogenen Tweets.
  • nach relevanten Tweets filtern mit vorher bestimmten Hashtags (“Twitter-Hashtags.xlsx”), Tweets in Kleinschreibung formatieren und als “final_tweets.rds” exportieren.
alle_tweets <- read_rds("Data/alle_tweets.rds")

suchbegriffe <- read_excel("Data/Twitter-Hashtags.xlsx", sheet ="Tabelle2")

suchbegriffe_vector <- suchbegriffe$Hashtags

alle_tweets <- bind_rows(alle_tweets)

alle_tweets <- alle_tweets %>% 
  mutate(text = tolower(text))

filtert_tweets <- alle_tweets %>% 
  filter(str_detect(text, paste (suchbegriffe_vector, collapse = "|")))

write_rds(filtert_tweets, "final_tweets.rds")

Sentimentanalyse

Parlamentarier_senti <- Parlamentarier %>% 
  filter(Partei!="BIW") %>% 
  filter(Partei!="SSW") %>% 
  filter(Partei!="BVB/FW") %>% 
  filter(Partei!="FW") %>% 
  filter(Partei!="fraktionslos") %>% 
  filter(SM_Twitter_user != "") %>% 
  select(Name, Partei, SM_Twitter_user, Geschlecht) %>% 
  mutate(SM_Twitter_user=tolower(SM_Twitter_user))
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "CSU"] <- "CDU/CSU"
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "CDU"] <- "CDU/CSU"
Parlamentarier_senti$Partei[Parlamentarier_senti$Partei == "FDP/DVP"] <- "FDP" 
load("Data/sentiWS.RData")
sentiws <- dictionary(list(positive=positive, negative=negative))
tweet_corpus <- corpus(filtert_tweets, text_field = "text")
token <- tokens(tweet_corpus)
dfm <- dfm(token)

senti <- dfm_lookup(dfm, sentiws)  
senti <- dfm_group(senti, groups = screen_name)
senti_frame <- senti %>% 
  quanteda::convert(to = "data.frame") %>% 
  as_tibble() %>% 
  mutate(doc_id=tolower(doc_id))

senti_final_frame <- senti_frame %>% 
  full_join(Parlamentarier_senti, by=c("doc_id"="SM_Twitter_user")) %>% 
  group_by(Partei) %>% 
  summarise(across(c(negative, positive), ~round(sum(., na.rm = TRUE)/sum(negative + positive, na.rm = TRUE ), digits = 2)))

Barchart zum Sentiment der Tweets

  • Partei absteigend nach negativem Sentiment sortieren
  • Beschriftung der X- und Y Werte ändern
  • Barchart bilden und in ggplotly konvertieren
senti_bar <- senti_final_frame %>% 
  mutate(Partei = fct_reorder(Partei, positive, max)) %>% 
  pivot_longer(c(positive, negative), values_to = c("Verhältnis"), names_to = c("Äußerung")) %>% 
  ggplot() + 
  geom_bar(aes(Partei,
               Verhältnis,               
               fill = Äußerung),
           position = "stack",
           stat = "identity") +
  scale_fill_manual(values = c("#f46666", "#8EC9BB")) + 
  theme_classic() + 
  labs(
    title = "Äußerungen der Politiker*innen auf Twitter zum Thema 'Gender'",
    subtitle = "Einschätzung durch Sentimentanalyse",
    x = "Partei",
    y = "Verhältnis",
    fill = "Äußerung"
  )

final_senti_plot <- ggplotly(senti_bar)
final_senti_plot

Sentiment-Analyse von Tweets zum Thema Gender

Als Grundlage für die hier visualisierte Sentiment-Analyse dienen Tweets, welche von Abgeordneten der Landtage und des Bundestages zum Thema Gender abgesetzt wurden. Mit dieser Sentiment-Analyse ließ sich ermitteln, ob diese Tweets eher positiv oder eher negativ verfasst sind. Dafür wurde ein Wörterbuch eingesetzt, welches negativ und positiv konnotierte Worte und Äußerungen inklusive Gewichtungen beinhaltet. Dieses wurde mit den Tweets abgeglichen. Das Ergebnis zeigt, wie hoch der Anteil negativer und positiver Äußerungen ist.

Um dies umzusetzen, wurden zunächst mithilfe des DBoeS-Datensatzes alle Abgeordneten ausgewählt, die überhaupt einen Twitter-Account besitzen.

Anschließend wurden von diesen Nutzer:innen jeweils die letzten 1.000 Tweets heruntergeladen. Diese wurden auf 47 Hashtags gefiltert, welche vorher festgelegt wurden, um das Thema Gender abzubilden (z.B. #gendersternchen, #gendergaga, #equalpayday etc.)*. Es wurde darauf geachtet, dass sowohl positive als auch negative Hashtags einbezogen werden, um möglichst alle Meinungen für die Analyse einbeziehen zu können.

Die so gefilterten Tweets wurden dann zu einem Corpus zusammengefasst. Mit diesem Corpus wurde eine Sentiment-Analyse durchgeführt, wobei der Wortschatz „SentiWS“* der Universität Leipzig als Grundlage diente. Anschließend wurde nach den einzelnen Parteien gruppiert und der passende Teil des Corpus (je nach Parteizugehörigkeit des oder der tweetenden Abgeordneten) inklusive Analyseergebnis zugeordnet.
*https://wortschatz.uni-leipzig.de/de/download

Die Ergebnisse der Analyse sind in der Visualisierung zu erkennen. Die Abgeordneten von der AfD und von Die Linke haben gemeinsam den höchsten Anteil negativer Tweets verfasst, jeweils die Hälfte wurde als negativ ausgewertet. Der geringste negative Teil wurde bei der CDU/CSU festgestellt.

Zu beachten ist, dass aus der Sentiment-Analyse nicht hervorgeht, ob beispielsweise negativ über die Gleichbehandlung der Geschlechter geschrieben wird oder negativ darüber, dass es noch keine Gleichbehandlung gibt. Der genaue Inhalt des Tweets bleibt unbeachtet. Somit lässt sich hier nicht ablesen, ob die Abgeordneten der Parteien jeweils für Geschlechtergleichheit plädieren oder dagegen. Gerade am Ergebnis von AfD und Die Linke wird dies deutlich, da die Einstellungen bezüglich des Themas trotz gleichwertigem Ergebnis höchstwahrscheinlich verschieden sind.

*Liste aller gesuchten Hashtags: #genderpaygap, #genderequality, #womenempowerment, #feminism, #feminismus, #gendergaga, #gender, #sexismus, #GeenaOnGender, #gendering, #gendersprache, #genderequity, #gleichberechtigung, #frauenpower, #frauenrechte, #frauenbewegung, #everydaysexism, #fightsexism, #sexism, #nomeansno, #AintNoCinderella, #NiUnaMenos, #NiUnaMas, #MyStealthyFreedom, #equalpay, #femaleempowerment, #gendersternchen, #manspreading, #gendern, #menaretrash, #gendersprech, #genderverbot, #gendershit, #equalpayday, #womensday, #weltfrauentag, #internationalwomensday, #frauentag, #gendergerechtesprache, #genderpolizei, #femalehero, #genderschwachsinn, #geballterFeminismus, #geschlechterwahn, #geschlechterwahnsinn, #frauen, #männer

Netzwerkanalyse deutscher Politiker*innen zum Thema Gender auf Twitter

tweets_network <- filtert_tweets %>% 
  select(screen_name,
         retweet_screen_name,
         created_at) 
parlamentarier_network <- Parlamentarier %>% 
  select(Name,
         Partei,
         SM_Twitter_user) %>% 
  drop_na(SM_Twitter_user) %>% 
  mutate(SM_Twitter_user = tolower(SM_Twitter_user)) %>% 
  rename("screen_name" = "SM_Twitter_user")

network_data <- parlamentarier_network %>% 
  left_join(tweets_network, by = "screen_name")
hauefigkeit_tweets <- network_data %>% 
  count(screen_name)

network_data <- network_data %>% 
  left_join(hauefigkeit_tweets, by = "screen_name")
screen_suche <- parlamentarier_network$screen_name

filtered_retweeters <- network_data %>% 
  #filter(str_detect(retweet_screen_name, paste (screen_suche, collapse = "|")))
  filter(retweet_screen_name %in% screen_suche)
netz <- filtered_retweeters %>% 
  filter(!is.na(retweet_screen_name)) %>% 
  select(from = screen_name, to = retweet_screen_name) %>% 
  as_tbl_graph

netz <- netz %>% 
  mutate(
    degree = centrality_degree(mode = "in"), 
    component = group_components()
  ) %>% 
  left_join(network_data %>% 
              select(Name, screen_name, Partei, n) %>% distinct(screen_name, .keep_all = T),
            by = c( "name" ="screen_name")) 
partei_farben <- list(
  "CDU/CSU" = "black",
  "SPD" = "red",
  "CSU" = "black",
  "FDP" = "#e2b007",
  "GRÜNE" = "#07C23F",
  "LINKE" = "#de4c8a", 
  "AfD" = "blue"
)

Netzwerk

Zuweisung von Attributen an Nodes: * Parteizugehörigkeit in Farbe * Klarname der Politikerinnen als Label Anzahl der Tweets in Größe

netz_plot <- netz %>% 
  filter(component <= 10) %>%  
  ggraph(layout = "fr") +
  geom_edge_link(edge_color = "black", alpha = 0.25, edge_width = 0.1, end_cap = circle(2.5, "mm"), arrow = arrow(length = unit(2.5, "mm"), ends =  "last", type = "closed")) +
  geom_node_point(aes(size = n, color = Partei)) + 
  scale_color_manual(values = partei_farben) +
  scale_size(range = c(1, 8)) + 
  theme_graph(background = "white") +
  geom_node_label(aes(filter = n >= 40, label = Name), repel = T, show.legend = F, alpha = 0.5) +
  labs(title = "Retweet-Netzwerke deutscher Politiker*innen", size = "Anzahl Tweets", subtitle = "zum Thema 'Gender' ab 2016")
netz_plot

Retweet-Netzwerke deutscher Politiker*innen zum Thema Gender

Um die Aktivität einzelner Politiker*innen und ihre Vernetzung untereinander in Debatten, Diskussionen, Meinungsäußerungen und Stellungnahmen zum Thema Gender auf Twitter abzubilden, wurde sowohl die individuelle Anzahl der Tweets zum Thema als auch ihre gegenseitige Bezugnahme aufeinander in Form von Retweets untersucht. Diese Informationen wurden in einem Netzwerkdiagramm dargestellt.

Die so entstandenen Retweet-Netzwerke wurden aus den letzten 1.000 Tweets derjenigen Abgeordneten, welche über einen Twitter-Account verfügen und sich in diesen letzten 1.000 Tweets mindestens einmal zum Thema Gender äußerten, generiert. Der älteste miteinbezogene Tweet zum Thema wurde im August 2016 abgesetzt. Dennoch deckt diese Netzwerkanalyse nicht die Twitter-Aktivität aller untersuchten Politiker*innen bis zurück zu diesem Zeitpunkt ab. Grund hierfür ist, dass einige Politiker:innen, gemessen an der Frequenz, in der sie Tweets absetzen, eine vergleichsweise hohe Aktivität auf Twitter aufweisen, weswegen ihre letzten 1.000 Tweets nicht bis in den August 2016 zurückreichen.

Die Punkte in der Grafik stellen einzelne Abgeordnete dar. Die Größe des jeweiligen Punktes veranschaulicht die Anzahl der von der/dem Abgeordneten abgesetzten Tweets zum Thema Gender und gibt somit Aufschluss über eine eventuelle Schwerpunktsetzung der/des Abgeordneten. Zusätzlich wurden die Namen der Abgeordneten mit 40 und mehr Tweets zum Thema eingeblendet. Eine Verbindung zwischen zwei Punkten stellt einen Tweet dar, der geretweetet wurde. Dabei entspringt der Pfeil bei der/dem retweetenden Abgeordneten und weist auf die/den Abgeordneten, von der/dem der originäre Tweet stammt. Gehen mehrere Pfeile von einem Punkt aus, hat der/die entsprechende Abgeordnete mehrere Tweets anderer Abgeordneter geretweetet. Weisen mehrere Pfeile auf einen Punkt, so wurde der/die entsprechende Abgeordnete mehrfach von anderen Abgeordneten geretweetet. Zwischen zwei Punkten kann mehr als eine Verbindung bestehen. Die Farbe der Punkte symbolisiert die Parteizugehörigkeit der Abgeordneten.

In der Grafik sind mehrere nicht miteinander verbundene Netzwerkstrukturen zu erkennen. Sind Punkte in keiner Weise durch Verbindungslinien miteinander verknüpft, so nehmen die Abgeordneten in ihren entsprechenden Tweets keinen Bezug, oder zumindest keinerlei Bezug in Form von Retweets, aufeinander.

Das Verhältnis der einzelnen Netzwerke zueinander ist daher folgendermaßen zu beschreiben: Zwar können die nicht miteinander verknüpften Kommunikationsketten den gleichen Anlass zum Thema haben, weil sie z.B. in der gleichen Debatte entstanden sind (ohne dass dabei Verknüpfungen durch Retweets entstanden sind), sie können jedoch auch zu anderen Zeitpunkten und Anlässen entstanden sein, womit sie in keinem direkten Zusammenhang zueinander stünden. Was sie verbindet, ist dass sie das Kommunikationsverhalten und die Vernetzungsstrukturen von Bundestags- und Landtagsabgeordneten auf Twitter zum Thema Gender, welches durch die 47 Suchbegriffe (siehe Sentimentanalyse) erschlossen wurde, darstellen.

Es fällt auf, dass Abgeordnete der Parteien Grüne und Die Linke besonders stark in den Netzwerkstrukturen vertreten sind. Für alle Parteien ist festzustellen, dass die Abgeordneten sich zum Großteil parteiintern retweeten und vom Retweeten Abgeordneter anderer Parteien eher absehen. Dabei stechen erneut die Parteien Grüne und Die Linke durch eine etwas stärkere überparteiliche Vernetzung besonders untereinander hervor. Auch Abgeordnete der CDU nehmen vereinzelt Bezug auf Abgeordnete anderer Parteien. Wobei sowohl bei ihr als auch bei der SPD die verhältnismäßig geringe Präsenz in der Summe der Netzwerke auffällt. Bei FDP und AfD hingegen fällt die Isolation ihrer Netzwerke vom Rest der Netzwerkstrukturen auf. Während die FDP dabei jedoch verhältnismäßig starke innerparteiliche Verknüpfungen aufweist, sind die Netzwerke der AfD eher voneinander isoliert.

Zusammenfassung der Ergebnisse

Zusammenfassend hat die Analyse gezeigt, dass es eine Diskrepanz zwischen der realen Geschlechterverteilung in der Gesellschaft und der Verteilung in der Repräsentation durch die Abgeordneten gibt.

Auch innerhalb der Parteien spielt das Thema Gender eine unterschiedlich große Rolle. Die Fraktionen der Parteien Grüne und Die Linke haben den verhältnismäßig größten Frauenanteil. In der Netzwerkanalyse zeigt sich, dass ebenfalls diese beiden Parteien sehr aktiv an dem Thema beteiligt sind.

Die Sentiment-Analyse hat gezeigt, dass sich die Fraktionen AfD und Die Linke zu 50% negativ und 50% positiv zu dem Thema auf Twitter äußern. Die anderen fünf Parteien melden sich eher positiv.

LS0tDQp0aXRsZTogIkRhdGVuYW5hbHlzZXByb2pla3QgenVtIFRoZW1hIEdlbmRlciBpbiBkZXIgZGV1dHNjaGVuIFBvbGl0aWsiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sgDQotLS0NCg0K4oCe4oCYSmVkZXIgc29sbCBwcml2YXQgI2dlbmRlcm4gd2llIGVyIHdpbGwsIGFiZXIgaWNoIG3DtmNodGUgbWljaCBuaWNodCBpbSDDtmZmZW50bGljaC1yZWNodGxpY2hlbiBSdW5kZnVuayBtaXQgbW9yYWxpc2NoZW0gWmVpZ2VmaW5nZXIgYmVsZWhyZW4gbGFzc2VuLCB3aWUgaWNoIHp1IHNwcmVjaGVuIGhhYmUuIFdlciBnaWJ0IGdlYsO8aHJlbmZpbmFuemllcnRlbiBSZWRha3RldXJlbiBkYXMgUmVjaHQsIGRhZsO8ciBBbnBhc3N1bmdzZHJ1Y2sgenUgZXJ6ZXVnZW4/4oCYICh0bSkgI01lcnogI0xhbnrigJwg4oCTIHNvIGxhdXRldCBlaW4gVHdlZXQgdm9uIENEVS1Qb2xpdGlrZXIgRnJpZWRyaWNoIE1lcnogdm9tIDA3LjA1LjIwMjEuIA0KDQrDnGJlciBkYXMgR2VuZGVybiBpbiBkZXIgU3ByYWNoZSB3aXJkIGFrdHVlbGwgaGl0emlnIGRpc2t1dGllcnQuIEFuc3RlbGxlIGRlcyBnZW5lcmlzY2hlbiBNYXNrdWxpbnVtcyB3ZXJkZW4gZGFiZWkgenVyIEdsZWljaHN0ZWxsdW5nIGRlciBHZXNjaGxlY2h0ZXIgZW50d2VkZXIgYWxsZSB0YXRzw6RjaGxpY2ggZ2VtZWludGVuIEdlc2NobGVjaHRlciBha3RpdiBnZW5hbm50IG9kZXIgZ2VzY2hsZWNodHNuZXV0cmFsZSBCZWdyaWZmZSB2ZXJ3ZW5kZXQuIERhcyBCZWlzcGllbCB2b24gRnJpZWRyaWNoIE1lcnogemVpZ3QsIGRhc3MgbmljaHQgamVkZSpyIG1pdCBkaWVzZXIgc3ByYWNobGljaGVuIEFucGFzc3VuZyBlaW52ZXJzdGFuZGVuIGlzdC4gDQoNCkF1Y2ggaW4gYW5kZXJlbiBCZXJlaWNoZW4gYmxlaWJ0IGRpZSBmZWhsZW5kZSBHbGVpY2hzdGVsbHVuZyByZWxldmFudDogTGF1dCBTdGF0aXN0aXNjaGVtIEJ1bmRlc2FtdCBoYWJlbiBGcmF1ZW4gaW0gSmFociAyMDIwIGR1cmNoc2Nobml0dGxpY2ggMTglIHdlbmlnZXIgQmV6YWhsdW5nIGVyaGFsdGVuIGFscyBNw6RubmVyLiBVbmQgZGVyIEFudGVpbCB2b24gRnJhdWVuIGluIEF1ZnNpY2h0c3LDpHRlbiB2b24gVW50ZXJuZWhtZW4sIGRpZSBrZWluZXIgZmVzdGVuIFF1b3RlbnJlZ2VsdW5nIHVudGVybGllZ2VuLCBiZXRyw6RndCBha3R1ZWxsIG51ciAxOSw5JSAoQk1GU0ZKKS4gDQoNCkRpZSBnZW5hbm50ZW4gQmVpc3BpZWxlIHplaWdlbiBkaWUgQWt0dWFsaXTDpHQgZGVzIFRoZW1hcywgd2VzaGFsYiBpbSBSYWhtZW4gZGllc2VzIFByb2pla3RzIHVudGVyc2NoaWVkbGljaGUgRGF0ZW5hbmFseXNlbiB1bmQgLXZpc3VhbGlzaWVydW5nZW4gZHVyY2hnZWbDvGhydCB3dXJkZW4sIHdlbGNoZSBzaWNoIGFsbGUgdW0gZGFzIFRoZW1hIEdlbmRlciBpbiBkZXIgUG9saXRpayBkcmVoZW4uIA0KDQpVbSB6dSB1bnRlcnN1Y2hlbiwgd2llIHNpY2ggZGllIEZyYXVlbnF1b3RlIGJlaSBkZW4gVmVydHJldGVyOmlubmVuIGRlciBHZXNlbGxzY2hhZnQgZGFyc3RlbGx0LCB3dXJkZSB6dW7DpGNoc3QgZWluZSBBbmFseXNlIGRlciBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGRlciBGcmFrdGlvbmVuIGltIEJ1bmRlc3RhZyB1bmQgaW4gZGVuIExhbmR0YWdlbiBkdXJjaGdlZsO8aHJ0LiBBdcOfZXJkZW0gd3VyZGUgZGllIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgZGVyIExhbmR0YWdlIG9obmUgRnJha3Rpb25zYmV6dWcgcHJvIEJ1bmRlc2xhbmQgdW50ZXJzdWNodCwgdW0gZWluZW4gTMOkbmRlcnZlcmdsZWljaCB6dSBlcm3DtmdsaWNoZW4uIEJhc2lzIGbDvHIgZGllc2UgQXVzd2VydHVuZyB3YXIgZGVyIGFrdHVlbGxlIERCb2VTLURhdGVuc2F0eiB2b24g4oCcMjAyMCBMZWlibml6LUluc3RpdHV0IGbDvHIgTWVkaWVuZm9yc2NodW5nIHwgSGFucy1CcmVkb3ctSW5zdGl0dXQiIMO8YmVyIGRldXRzY2hlIFBvbGl0aWtlcippbm5lbi4gKExpbmsgenVtIERhdGVuc2F0ejogaHR0cHM6Ly9naXRodWIuY29tL0xlaWJuaXotSEJJL0RCb2VTLUF1dG9tYXRpemF0aW9uL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpICANCg0KQXXDn2VyZGVtIHd1cmRlbiBUd2VldHMgdm9uIFBvbGl0aWtlcippbm5lbiB6dW0gVGhlbWEgR2VuZGVyIGFscyBHcnVuZGxhZ2UgZsO8ciBlaW5lIFNlbnRpbWVudC1BbmFseXNlIHZlcndlbmRldC4gDQoNCkRpZXNlciBUd2l0dGVyLURhdGVuc2F0eiB3dXJkZSBhYnNjaGxpZcOfZW5kIGVpbmdlc2V0enQsIHVtIGVpbmUgTmV0endlcmthbmFseXNlIGR1cmNoenVmw7xocmVuOiBEYXJnZXN0ZWxsdCB3aXJkLCB3ZWxjaGUgUG9saXRpa2VyKmlubmVuIGR1cmNoIFJldHdlZXRzIG1pdGVpbmFuZGVyIHZlcm5ldHp0IHNpbmQgdW5kIHNpY2ggc28gYXVmZWluYW5kZXIgYmV6aWVoZW4uIA0KDQojIyMgTG9hZCBsaWJyYXJpZXMgDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dGV4dCkgDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocXVhbnRlZGEpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KGxlYWZsZXQubWluaWNoYXJ0cykNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkocnR3ZWV0KQ0KbGlicmFyeShnZ3JhcGgpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KHRpZHlncmFwaCkNCmBgYA0KDQojIyMgTG9hZCBEYXRhIA0KDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIHJlYWRfY3N2KCJEYXRhL1BhcmxhbWVudGFyaWVyLmNzdiIpDQpgYGANCg0KRVUtUGFybGFtZW50IHJhdXNmaWx0ZXJuDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgZmlsdGVyKEthdGVnb3JpZSE9IkVVLVBhcmxhbWVudCIpDQpgYGANCg0KUmVhZCBUYWJlbGxlbiBtaXQgZmVobGVuZGVuIEdlc2NobGVjaHRlcm4NCmBgYHtyfQ0KYWxsZV9nZXNjaGxlY2h0ZXIgPC0gcmVhZF9leGNlbCgiRGF0YS9QYXJsYW1lbnRhcmllcl9nZXNjaGVjaHRlci54bHN4Iiwgc2hlZXQgPSAiR2VzY2hsZWNodGVyIikNCmBgYA0KDQpKb2luIGZlaGxlbmRlIEdlc2NobGVjaHRlcmFuZ2FiZW4gDQpgYGB7cn0NClBhcmxhbWVudGFyaWVyIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgbGVmdF9qb2luKGFsbGVfZ2VzY2hsZWNodGVyLCBieSA9IGMoIk5hbWUiID0gIk5hbWUiKSkNCmBgYA0KDQpSZW5hbWUgU3BhbHRlbg0KYGBge3J9DQpQYXJsYW1lbnRhcmllciA8LSBQYXJsYW1lbnRhcmllciAlPiUgDQogIHJlbmFtZShHZXNjaGxlY2h0ID0gR2VzY2hsZWNodC55KQ0KYGBgDQoNCiMjIyBCdW5kZXN0YWcgR2VzY2hsZWNodGVydmVydGVpbHVuZyBwcm8gUGFydGVpDQoNCiogZmlsdGVybiBuYWNoIEJ1bmRlc3RhZw0KKiBDRFUgJiBDU1UgenVzYW1tZW5mw7xnZW4gDQoqIG5hY2ggbcOkbm5saWNoIHVuZCB3ZWlibGljaCBncnVwcGllcmVuLCBBbnphaGwgYmVyZWNobmVuIHVuZCBzb3J0aWVyZW4NCmBgYHtyfQ0KYnVuZGVzdGFnIDwtIFBhcmxhbWVudGFyaWVyICU+JSANCiAgc2VsZWN0KGlkLCBOYW1lLCBHZXNjaGxlY2h0LCBQYXJ0ZWksIEthdGVnb3JpZSwgU01fVHdpdHRlcl9pZCwgU01fVHdpdHRlcl91c2VyKSAlPiUgDQogIGZpbHRlcihLYXRlZ29yaWU9PSJCdW5kZXN0YWciKQ0KDQpidW5kZXN0YWckUGFydGVpW2J1bmRlc3RhZyRQYXJ0ZWkgPT0gIkNTVSJdIDwtIkNEVS9DU1UiDQpidW5kZXN0YWckUGFydGVpW2J1bmRlc3RhZyRQYXJ0ZWk9PSJDRFUiXTwtIkNEVS9DU1UiDQoNCmJ1bmRlc3RhZ19tYW4gPC0gYnVuZGVzdGFnICU+JSANCiAgZ3JvdXBfYnkoUGFydGVpKSAlPiUgDQogIGZpbHRlcihHZXNjaGxlY2h0ID09ICJtw6RubmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZShnZXNhbXRfbWFuPW4oKSkNCg0KYnVuZGVzdGFnX2dlc2FtdCA8LSBidW5kZXN0YWcgJT4lIA0KICBncm91cF9ieShQYXJ0ZWkpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQgPT0gIndlaWJsaWNoIikgJT4lIA0KICBzdW1tYXJpc2UoZ2VzYW10X2ZyYXU9bigpKSAlPiUgDQogIGxlZnRfam9pbihidW5kZXN0YWdfbWFuKSAlPiUgDQogIG11dGF0ZShyb3dfc3VtPXJvd1N1bXMoLlsyOjNdKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Mocm93X3N1bSkpDQpgYGANCg0KIyMgQmFsa2VuZGlhZ3JhbW06IEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW0gQnVuZGVzdGFnDQoNCiogU3RhY2tlZC1CYXJjaGFydCB6dXIgR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbSBCdW5kZXN0YWcgcHJvIFBhcnRlaQ0KKiB2aXN1YWxpc2llcnVuZyBkZXIgRGF0ZW4gaW4gbcO2Z2xpY2hzdCBnZXNjaGxlY2h0ZXJuZXVyYWxlbiBGYXJiZW4NCmBgYHtyfQ0KcGxvdF9seShkYXRhPWJ1bmRlc3RhZ19nZXNhbXQsIHg9fnJlb3JkZXIoUGFydGVpLC1yb3dfc3VtKSwgeT1+Z2VzYW10X2ZyYXUsIG5hbWU9IndlaWJsaWNoIiwgbWFya2VyPWxpc3QoY29sb3I9dG9SR0IoIiNGQjdGNjIiKSksDQogICAgICAgIHR5cGU9ImJhciIsIGhvdmVyaW5mbz0idGV4dCIsIHRleHQ9fnBhc3RlKCIiLHJvd19zdW0pLCANCiAgICAgICAgaG92ZXJ0ZW1wbGF0ZT1wYXN0ZSgiQW56YWhsOiAle3k6LC4wZn0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkdlc2FtdGFuemFobDogJXt0ZXh0fSIpKSAlPiUgDQogIGFkZF90cmFjZSh5PX5nZXNhbXRfbWFuLCBuYW1lPSJtw6RubmxpY2giLCBtYXJrZXI9bGlzdChjb2xvcj10b1JHQigiIzc3NTI4NSIpKSkgJT4lIA0KICBsYXlvdXQoYmFybW9kZT0ic3RhY2siLCB0aXRsZT0iR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbiBkZW4gUGFydGVpZW4gaW0gQnVuZGVzdGFnIiwgIyB0aXRlbCBwb3NpdGlvbiB1bmQgZ3LDtsOfZSDDpG5kZXJuDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiIiksIHlheGlzPWxpc3QodGl0bGU9IkFuemFobCBBYmdlb3JkbmV0ZSIpKSAlPiUNCiAgbGF5b3V0KGxlZ2VuZD1saXN0KHg9MSwgeT0wLjUpKQ0KYGBgDQoNCiMjIyBMYW5kdGFnIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgcHJvIFBhcnRlaQ0KDQoqIGZpbHRlcm4gYWxsZW4gTGFuZHRhZ2VuDQoqIENEVSAmIENTVSBzb3dpZSBGRFAgJiBEVlAgenVzYW1tZW5mw7xnZW4gDQoqIG5hY2ggbcOkbm5saWNoIHVuZCB3ZWlibGljaCBncnVwcGllcmVuLCBBbnphaGwgYmVyZWNobmVuIHVuZCBzb3J0aWVyZW4NCmBgYHtyfQ0KbGFuZHRhZ19wYXJ0ZWkgPC0gUGFybGFtZW50YXJpZXIgJT4lIA0KICBmaWx0ZXIoS2F0ZWdvcmllICE9IkJ1bmRlc3RhZyIpICU+JSANCiAgZmlsdGVyKEthdGVnb3JpZSE9IkVVLVBhcmxhbWVudCIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSAhPSJCSVciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJTU1ciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJCVkIvRlciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJGVyIpDQpgYGANCg0KYGBge3J9DQpsYW5kdGFnX3BhcnRlaSRQYXJ0ZWlbbGFuZHRhZ19wYXJ0ZWkkUGFydGVpID09ICJDU1UiXSA8LSJDRFUvQ1NVIg0KbGFuZHRhZ19wYXJ0ZWkkUGFydGVpW2xhbmR0YWdfcGFydGVpJFBhcnRlaT09IkNEVSJdIDwtICJDRFUvQ1NVIg0KbGFuZHRhZ19wYXJ0ZWkkUGFydGVpW2xhbmR0YWdfcGFydGVpJFBhcnRlaT09IkZEUC9EVlAiXSA8LSAiRkRQIiANCmBgYA0KDQpgYGB7cn0NCmxhbmR0YWdfbWFuIDwtIGxhbmR0YWdfcGFydGVpICU+JSANCiAgZ3JvdXBfYnkoUGFydGVpKSAlPiUgDQogIGZpbHRlcihHZXNjaGxlY2h0PT0ibcOkbm5saWNoIikgJT4lIA0KICBzdW1tYXJpc2UoZ2VzYW10X21hbj1uKCkpDQoNCmxhbmR0YWdfZ2VzYW10IDwtIGxhbmR0YWdfcGFydGVpICU+JSANCiAgZ3JvdXBfYnkoUGFydGVpKSAlPiUgDQogIGZpbHRlcihHZXNjaGxlY2h0PT0id2VpYmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZShnZXNhbXRfZnJhdT1uKCkpICU+JSANCiAgbGVmdF9qb2luKGxhbmR0YWdfbWFuKSAlPiUgDQogICBtdXRhdGUocm93X3N1bT1yb3dTdW1zKC5bMjozXSkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJvd19zdW0pKQ0KYGBgDQoNCiMjIEJhbGtlbmRpYWdyYW1tOiBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlbiBMYW5kdGFnZW4NCg0KKiBTdGFja2VkLUJhcmNoYXJ0IHp1ciBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlbiBMYW5kdGFnZW4gcHJvIFBhcnRlaQ0KKiB2aXN1YWxpc2llcnVuZyBkZXIgRGF0ZW4gaW4gbcO2Z2xpY2hzdCBnZXNjaGxlY2h0ZXJuZXVyYWxlbiBGYXJiZW4NCmBgYHtyfQ0KcGxvdF9seShkYXRhPWxhbmR0YWdfZ2VzYW10LCB4PX5yZW9yZGVyKFBhcnRlaSwtcm93X3N1bSksIHk9fmdlc2FtdF9mcmF1LCBuYW1lPSJ3ZWlibGljaCIsIG1hcmtlcj1saXN0KGNvbG9yPXRvUkdCKCIjRkI3RjYyIikpLCANCiAgICAgICAgdHlwZT0iYmFyIiwgaG92ZXJpbmZvPSJ0ZXh0IiwgdGV4dD1+cGFzdGUoIiIscm93X3N1bSksIA0KICAgICAgICBob3ZlcnRlbXBsYXRlPXBhc3RlKCJBbnphaGw6ICV7eTosLjBmfSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+R2VzYW10YW56YWhsOiAle3RleHR9IikpICU+JSANCiAgYWRkX3RyYWNlKHk9fmdlc2FtdF9tYW4sIG5hbWU9Im3DpG5ubGljaCIsIG1hcmtlcj1saXN0KGNvbG9yPXRvUkdCKCIjNzc1Mjg1IikpKSAlPiUgDQogIGxheW91dChiYXJtb2RlPSJzdGFjayIsIHRpdGxlPSJHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlbiBQYXJ0ZWllbiBpbiBkZW4gTGFuZHRhZ2VuIiwgIyB0aXRlbCBwb3NpdGlvbiB1bmQgZ3LDtsOfZSDDpG5kZXJuDQogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSIiKSwgeWF4aXM9bGlzdCh0aXRsZT0iQW56YWhsIEFiZ2VvcmRuZXRlIikpICU+JQ0KICBsYXlvdXQobGVnZW5kPWxpc3QoeD0xLCB5PTAuNSkpDQpgYGANCiMgQmFsa2VuZGlhZ3JhbW1lOiBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nDQoNCkRpZSBiZWlkZW4gQmFsa2VuZGlhZ3JhbW1lIHplaWdlbiBkaWUgYWt0dWVsbGUgZnJha3Rpb25zYmV6b2dlbmUgR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbiBkZXIgZGV1dHNjaGVuIFBvbGl0aWsg4oCTIGVpbm1hbCBpbiBCZXp1ZyBhdWYgZGVuIEJ1bmRlc3RhZyB1bmQgZWlubWFsIGhpbnNpY2h0bGljaCBkZXIgTGFuZHRhZ2UuIEltIHp3ZWl0ZW4gRmFsbCB3dXJkZW4gZGllIEFiZ2VvcmRuZXRlbiBhbGxlciBMYW5kdGFnZSBhZGRpZXJ0LCB1bSBzbyBlaW5lbiBkdXJjaHNjaG5pdHRsaWNoZW4gR2VzYW10w7xiZXJibGljayB6dSBlcm3DtmdsaWNoZW4uIA0KDQpGw7xyIGVpbmUgYmVzc2VyZSBWZXJnbGVpY2hiYXJrZWl0IGtvbnplbnRyaWVyZW4gc2ljaCBiZWlkZSBEYXJzdGVsbHVuZ2VuIGF1ZiBpaHJlIGdlbWVpbnNhbWUgU2Nobml0dG1lbmdlIGRlciBGcmFrdGlvbmVuLiBTbyB3aXJkIGJlaXNwaWVsc3dlaXNlIGRpZSBTU1cgbmljaHQgYXVmZ2Vmw7xocnQsIGRhIHNpZSBudXIgaW0gU2NobGVzd2lnLUhvbHN0ZWluaXNjaGVuIExhbmR0YWcgYWdpZXJ0LiANCg0KRnJha3Rpb25lbiwgZGllIGluIGJlc3RpbW10ZW4gTMOkbmRlcm4gYW5kZXJlIEJlemVpY2hudW5nZW4gaGFiZW4sIHd1cmRlbiB6dXNhbW1lbmdlZmFzc3QgKENEVS9DU1UgdW5kIEZEUC9EVlAgenUgRkRQKS4gDQoNCkltIHZlcndlbmRldGVuIERhdGVuc2F0eiBsYWdlbiB6d2FyIEluZm9ybWF0aW9uZW4genVtIEdlc2NobGVjaHQgdm9yLCBkaWVzZSB3YXJlbiBqZWRvY2ggbMO8Y2tlbmhhZnQuIEZlaGxlbmRlIEdlc2NobGVjaHRzYW5nYWJlbiB3dXJkZW4gbWFudWVsbCBoaW56dWdlZsO8Z3QsIHdvYmVpIHZvbSDDvGJsaWNoZW4gR2VudXMgZGVzIE5hbWVucyBhdWYgZGFzIEdlc2NobGVjaHQgZ2VzY2hsb3NzZW4gd3VyZGUuIA0KDQpEaWUgSMO2aGUgZGVyIEJhbGtlbiBnaWJ0IGpld2VpbHMgYW4sIHdpZSB2aWVsZSBBYmdlb3JkbmV0ZSBkaWUgamV3ZWlsaWdlIEZyYWt0aW9uIGhhdC4gRGVyIGxpbGFmYXJiZW5lIFRlaWwgamVkZXMgQmFsa2VucyB6ZWlndCBkaWUgQW56YWhsIGRlciBtw6RubmxpY2hlbiwgZGVyIG9yYW5nZW5lIEJhbGtlbiBkaWUgWmFobCBkZXIgd2VpYmxpY2hlbiBBYmdlb3JkbmV0ZW4uIEhvdmVydCBtYW4gw7xiZXIgZGllIEJhbGtlbiwgd2lyZCBkaWUgamV3ZWlscyBnZXNjaGxlY2h0c2Jlem9nZW5lIEFuemFobCBzb3dpZSBkaWUgR2VzYW10YW56YWhsIGRlciBBYmdlb3JkbmV0ZW4gYW5nZXplaWd0LCB1bSBlaW5lIEVpbnNjaMOkdHp1bmcgZGVzIEFudGVpbHMgenUgZXJtw7ZnbGljaGVuLiANCg0KRXMgaXN0IGVya2VubmJhciwgZGFzcyBkaWUgQWZEIHNvd29obCBpbiBkZW4gTGFuZHRhZ2VuIGFscyBhdWNoIGltIEJ1bmRlc3RhZyBkZXV0bGljaCBtZWhyIG3DpG5ubGljaGUgQWJnZW9yZG5ldGUgc3RlbGx0LiBFaW5lIGViZW5zbyBhdWZmw6RsbGlnZSBVbmdsZWljaGhlaXQgaXN0IGJlaSBkZXIgRkRQIHVuZCBDRFUvQ1NVIHp1IHNlaGVuLiANCg0KTmFoZXp1IGF1c2dlZ2xpY2hlbiBpc3QgZGFnZWdlbiBkaWUgU1BEIGltIEJ1bmRlc3RhZywgZWJlbnNvIHdpZSBEaWUgTGlua2UgaW4gZGVuIExhbmR0YWdlbi4gSW0gQnVuZGVzdGFnIGdpYnQgZXMgYmVpIERpZSBMaW5rZSBzb3dpZSBiZWkgZGVuIEdyw7xuZW4gbWVociB3ZWlibGljaGUgYWxzIG3DpG5ubGljaGUgQWJnZW9yZG5ldGUuIA0KDQoNCg0KDQoNCiMjIyBLYXJ0ZSBtaXQgR2VzY2hsZWNodGVydmVydGVpbHVuZyBpbiBkZW4gTGFuZHRhZ2VuDQoNCiogQWxsZSBMYW5kdGFnZSBoZXJhdXNmaWx0ZXJuDQpgYGB7cn0NCnBhcmxhbWVudGFyaWVyX2xhbmR0YWcgPC0gUGFybGFtZW50YXJpZXIgJT4lIA0KICBmaWx0ZXIoS2F0ZWdvcmllICVpbiUgYygiQWJnZW9yZG5ldGVuaGF1cyB2b24gQmVybGluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCYXllcmlzY2hlciBMYW5kdGFnIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVtaXNjaGUgQsO8cmdlcnNjaGFmdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFtYnVyZ2lzY2hlIELDvHJnZXJzY2hhZnQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlc3Npc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyBCcmFuZGVuYnVyZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyBkZXMgU2FhcmxhbmRlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZHRhZyBNZWNrbGVuYnVyZy1Wb3Jwb21tZXJuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5kdGFnIE5vcmRyaGVpbi1XZXN0ZmFsZW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmR0YWcgUmhlaW5sYW5kLVBmYWx6IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5kdGFnIFNhY2hzZW4tQW5oYWx0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5kdGFnIHZvbiBCYWRlbi1Xw7xydHRlbWJlcmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk5pZWRlcnPDpGNoc2lzY2hlciBMYW5kdGFnIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJTw6RjaHNpc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiU2NobGVzd2lnLUhvbHN0ZWluaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRow7xyaW5nZXIgTGFuZHRhZyIpKQ0KYGBgDQoNCiogVmVrdG9yZW4gdW5kIERhdGFmcmFtZSBlcnN0ZWxsZW4gbWl0IGRlbiBLb29yZGluYXRlbiBhbiBkZW5lbiBkaWUgc3DDpHRlcmVuIFBpZS1DaGFydHMgZml4aWVydCB3ZXJkZW4gc29sbGVuLiAoSW1tZXIgZ2VuYXUgaW0gTWl0dGVscHVua3QgZGVzIEJ1bmRlc2xhbmRlcykNCg0KYGBge3J9DQpLYXRlZ29yaWUgPC0gYygiQWJnZW9yZG5ldGVuaGF1cyB2b24gQmVybGluIiwgDQogICAgICAgICAgICAgICAiQmF5ZXJpc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgIkJyZW1pc2NoZSBCw7xyZ2Vyc2NoYWZ0IiwNCiAgICAgICAgICAgICAgICJIYW1idXJnaXNjaGUgQsO8cmdlcnNjaGFmdCIsIA0KICAgICAgICAgICAgICAgIkhlc3Npc2NoZXIgTGFuZHRhZyIsDQogICAgICAgICAgICAgICAiTGFuZHRhZyBCcmFuZGVuYnVyZyIsIA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgZGVzIFNhYXJsYW5kZXMiLA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgTWVja2xlbmJ1cmctVm9ycG9tbWVybiIsDQogICAgICAgICAgICAgICAiTGFuZHRhZyBOb3JkcmhlaW4tV2VzdGZhbGVuIiwNCiAgICAgICAgICAgICAgICJMYW5kdGFnIFJoZWlubGFuZC1QZmFseiIsDQogICAgICAgICAgICAgICAiTGFuZHRhZyBTYWNoc2VuLUFuaGFsdCIsIA0KICAgICAgICAgICAgICAgIkxhbmR0YWcgdm9uIEJhZGVuLVfDvHJ0dGVtYmVyZyIsIA0KICAgICAgICAgICAgICAgIk5pZWRlcnPDpGNoc2lzY2hlciBMYW5kdGFnIiwgDQogICAgICAgICAgICAgICAiU8OkY2hzaXNjaGVyIExhbmR0YWciLCANCiAgICAgICAgICAgICAgICJTY2hsZXN3aWctSG9sc3RlaW5pc2NoZXIgTGFuZHRhZyIsIA0KICAgICAgICAgICAgICAgIlRow7xyaW5nZXIgTGFuZHRhZyIpDQoNCmxhdCA8LSBjKDUyLjUyMDAwOCwNCiAgICAgICAgIDQ4LjkxNzQzMSwNCiAgICAgICAgIDUzLjA3NDk4MiwNCiAgICAgICAgIDUzLjU1MzgxNSwNCiAgICAgICAgIDUwLjY1MjA1MiwNCiAgICAgICAgIDUyLjQwODQxOCwNCiAgICAgICAgIDQ5LjM5NjQyMywNCiAgICAgICAgIDUzLjYxMjY1MSwNCiAgICAgICAgIDUxLjQzMzIzNywNCiAgICAgICAgIDUwLjExODM0NiwNCiAgICAgICAgIDUxLjk1MDI2NSwNCiAgICAgICAgIDQ4LjY2MTYwNCwNCiAgICAgICAgIDUyLjYzNjcwNCwNCiAgICAgICAgIDUxLjEwNDU0MSwNCiAgICAgICAgIDU0LjIxOTM2NywNCiAgICAgICAgIDUxLjAxMDk4OSkNCg0KbG5nIDwtIGMoMTMuNDA0OTU0LA0KICAgICAgICAgMTEuNDA3OTgwLA0KICAgICAgICAgOC44MDcwODAsDQogICAgICAgICA5Ljk5MTU3NSwNCiAgICAgICAgIDkuMTYyNDM4LA0KICAgICAgICAgMTIuNTYyNDkyLA0KICAgICAgICAgNy4wMjI5NjEsDQogICAgICAgICAxMi40Mjk1OTUsDQogICAgICAgICA3LjY2MTU5NCwNCiAgICAgICAgIDcuMzA4OTUzLA0KICAgICAgICAgMTEuNjkyMjc0LA0KICAgICAgICAgOS4zNTAxMzQsDQogICAgICAgICA5Ljg0NTA3NywNCiAgICAgICAgIDEzLjIwMTczOCwNCiAgICAgICAgIDkuNjk2MTE3LA0KICAgICAgICAgMTAuODQ1MzQ2KQ0KDQpidW5kZXNsYWVuZGVyX2tvb3JkaW5hdGVuIDwtIGRhdGEuZnJhbWUoS2F0ZWdvcmllLCBsYXQsIGxuZykNCmBgYA0KDQoqIERhdGFmcmFtZSBuYWNoIEFuemFobCBkZXIgbcOkbm5saWNoZW4gdW5kIHdlaWJsaWNoZW4gUG9saXRpa2VyKmlubmVuIHBybyBCdW5kZXNsYW5kIGZpbHRlcm4uDQoNCmBgYHtyfQ0KcGFybGFtZW50YXJpZXJfbWFuIDwtIHBhcmxhbWVudGFyaWVyX2xhbmR0YWcgJT4lIA0KICBncm91cF9ieShLYXRlZ29yaWUpICU+JSANCiAgZmlsdGVyKEdlc2NobGVjaHQgPT0gIm3DpG5ubGljaCIpICU+JSANCiAgc3VtbWFyaXNlKG3DpG5ubGljaCA9IG4oKSkNCg0KcGFybGFtZW50YXJpZXJfbGFuZHRhZ19nZXNhbXQgPC0gcGFybGFtZW50YXJpZXJfbGFuZHRhZyAlPiUgDQogIGdyb3VwX2J5KEthdGVnb3JpZSkgJT4lIA0KICBmaWx0ZXIoR2VzY2hsZWNodCA9PSAid2VpYmxpY2giKSAlPiUgDQogIHN1bW1hcmlzZSh3ZWlibGljaCA9IG4oKSkgJT4lIA0KICBsZWZ0X2pvaW4ocGFybGFtZW50YXJpZXJfbWFuKQ0KYGBgDQoNCiogS29vcmRpbmF0ZW4gZGVyIHNww6R0ZXJlbiBQaWUtQ2hhcnRzIHp1ciBIYXVwdHRhYmVsbGUgam9pbmVuDQoNCmBgYHtyfQ0KcGFybGFtZW50YXJpZXJfa29vcmRpbmF0ZW4gPC0gcGFybGFtZW50YXJpZXJfbGFuZHRhZ19nZXNhbXQgJT4lIA0KICBsZWZ0X2pvaW4oYnVuZGVzbGFlbmRlcl9rb29yZGluYXRlbiwgYnkgPSBjKCJLYXRlZ29yaWUiID0gIkthdGVnb3JpZSIpKQ0KYGBgDQoNCiMjIyBLYXJ0ZSBtaXQgVG9ydGVuZGlhZ3JhbW0genVyIEdlc2NobGVjaHRlcnZlcnRlaWx1bmcNCg0KKiBnZXNjaGxlY2h0ZXJuZXV0cmFsZSBGYXJiZW4gZsO8ciBkaWUgR2VzY2hsZWNodGVydmVydGVpbHVuZyBlcnN0ZWxsZW4sIHNvd2llIGRpZSBHcmVuemVuIGRlciBCdW5kZXNsw6RuZGVyIGltcG9ydGllcmVuIHVuZCBtaXQgTmFtZW4gdmVyc2VoZW4gKHBvcHVwKS4NCmBgYHtyfQ0KY29sb3JzIDwtIGMoIiNGQjdGNjIiLCAiIzc3NTI4NSIpDQoNCmdyZW56ZW4gPC0gcmVhZFJEUygiRGF0YS9nYWRtMzZfREVVXzFfc3AucmRzIikgJT4lIA0KICBzdF9hc19zZigpDQoNCnBvcHVwX2J1bmRlc2xhZW5kZXIgPC0gcGFzdGUwKCI8c3Ryb25nPkJ1bmRlc2xhbmQ6IDwvc3Ryb25nPiIsIGdyZW56ZW4kTkFNRV8xKQ0KYGBgDQoNCiogUGllLUNoYXJ0cyBtaXQgSGlsZmUgdm9uIGFkZE1pbmljaGFydHMgenVyIEthcnRlIGFuZ2Vmw7xndC4gDQoNCmBgYHtyfQ0KbWFwIDwtIGxlYWZsZXQoKSAlPiUgDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuVm95YWdlckxhYmVsc1VuZGVyKSAlPiUgDQogIHNldFZpZXcobG5nID0gMTAuNDUxNTI2LCBsYXQgPSA1MS4xNjU2OTEsIHpvb20gPSA1LjUpICU+JSANCiAgYWRkUG9seWdvbnMoZGF0YSA9IGdyZW56ZW4sDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9ICJncmV5IiwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjEsDQogICAgICAgICAgICAgIHdlaWdodCA9IDMsDQogICAgICAgICAgICAgIGNvbG9yID0gImdyZXkiLA0KICAgICAgICAgICAgICBwb3B1cCA9IHBvcHVwX2J1bmRlc2xhZW5kZXIpICU+JSANCiAgYWRkTWluaWNoYXJ0cygNCiAgICBwYXJsYW1lbnRhcmllcl9rb29yZGluYXRlbiRsbmcsIHBhcmxhbWVudGFyaWVyX2tvb3JkaW5hdGVuJGxhdCwNCiAgICB0eXBlID0gInBpZSIsDQogICAgY2hhcnRkYXRhID0gcGFybGFtZW50YXJpZXJfa29vcmRpbmF0ZW5bLCBjKCJ3ZWlibGljaCIsICJtw6RubmxpY2giKV0sDQogICAgY29sb3JQYWxldHRlID0gY29sb3JzLA0KICAgIHdpZHRoID0gNDYsDQogICAgaGVpZ2h0ID0gNDYsDQogICAgb3BhY2l0eSA9IDAuOCwNCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJib3R0b21yaWdodCINCiAgKQ0KbWFwDQpgYGANCiMgS2FydGUgbWl0IEdlc2NobGVjaHRlcnZlcnRlaWx1bmcgaW4gZGVuIExhbmR0YWdlbg0KDQpEaWUgYXVmIGRlciBEZXV0c2NobGFuZGthcnRlIGFiZ2ViaWxkZXRlbiBUb3J0ZW4tRGlhZ3JhbW1lIHZlcmFuc2NoYXVsaWNoZW4gZGllIFNpdHp2ZXJ0ZWlsdW5nIGRlciBBYmdlb3JkbmV0ZW4gaW4gZGVuIGRldXRzY2hlbiBMYW5kZXNwYXJsYW1lbnRlbiBhdWZnZXNjaGzDvHNzZWx0IG5hY2ggZGVyIEdlc2NobGVjaHRlcnp1Z2Vow7ZyaWdrZWl0IChtw6RubmxpY2hlbiBBYmdlb3JkbmV0ZSwgd2VpYmxpY2hlbiBBYmdlb3JkbmV0ZSkuICANCg0KRGFiZWkgd3VyZGUsIHVtIGRlbiBBc3Bla3QgZGVyIGxhbmRlc3NwZXppZmlzY2hlbiwgYWJlciBkZXV0c2NobGFuZHdlaXRlbiBHZXNjaGxlY2h0ZXJyZXByw6RzZW50YW56IGhlcnZvcnp1aGViZW4sIGRpZSBGcmFrdGlvbnN6dWdlaMO2cmlna2VpdCBkZXIgQWJnZW9yZG5ldGVuIGluIGRlciBEYXJzdGVsbHVuZyBuaWNodCBiZXLDvGNrc2ljaHRpZ3QuICANCg0KWnVuw6RjaHN0IGbDpGxsdCBhdWYsIGRhc3MgaW4gYWxsZW4gTGFuZGVzcGFybGFtZW50ZW4gbWVociBtw6RubmxpY2hlIEFiZ2VvcmRuZXRlIGFscyB3ZWlibGljaGUgQWJnZW9yZG5ldGUgc2l0emVuLiBCZWluYWhlIGluIGplZGVtIExhbmR0YWcgYmV3ZWd0IHNpY2ggZGllc2UgdW5nbGVpY2hlIFNpdHp2ZXJ0ZWlsdW5nIHp3aXNjaGVuIGVpbmVyIHp3ZWlkcml0dGVsIC0gYmlzIHp1IGVpbmVyIGRyZWl2aWVydGVsLSBNZWhyaGVpdCBhbiBtw6RubmxpY2hlbiBBYmdlb3JkbmV0ZW4uICANCg0KRWluemlnIGRpZSBIYW1idXJnaXNjaGUgQsO8cmdlcnNjaGFmdCB3ZWlzdCBhbm7DpGhlcm5kIGVpbiBhdXNnZWdsaWNoZW5lcyAxLXp1LTEtVmVyaMOkbHRuaXMgendpc2NoZW4gbcOkbm5saWNoZW4gdW5kIHdlaWJsaWNoZW4gQWJnZW9yZG5ldGVuIGF1Ziwgd2VubmdsZWljaCBhdWNoIGhpZXIgZGllIEFuemFobCBkZXIgbcOkbm5saWNoZW4gQWJnZW9yZG5ldGVuIGxlaWNodCDDvGJlcndpZWd0LiBBbSBncsO2w590ZW4gaXN0IGRpZSBVbmF1c2dlZ2xpY2hlbmhlaXQgaW4gU2FjaHNlbi1BbmhhbHQgbWl0IDQ2IHdlaWJsaWNoZW4gQWJnZW9yZG5ldGVuIHVuZCA4MyBtw6RubmxpY2hlbiBBYmdlb3JkbmV0ZW4uIA0KDQoNCg0KDQoNCiMgVHdlZXRzIGRlciBQb2xpdGlrZXIqaW5uZW4gc2NyYXBlbg0KDQpOaWNodCBhbHMgYXVzZsO8aHJiYXJlbiBDb2RlLCBkYW1pdCBkaWUgRGF0ZW4gbmljaHQgbm9jaG1hbHMgZ2V6b2dlbiB3ZXJkZW4uLi4NCg0KVHdpdHRlcl9hY2NvdW50cyA8LSBQYXJsYW1lbnRhcmllciAlPiUNCiAgZmlsdGVyKEthdGVnb3JpZSE9IkVVLVBhcmxhbWVudCIpICU+JQ0KICBmaWx0ZXIoUGFydGVpIT0iQklXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iU1NXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iQlZCL0ZXIikgJT4lIA0KICBmaWx0ZXIoUGFydGVpIT0iRlciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJmcmFrdGlvbnNsb3MiKSAlPiUgDQogIGZpbHRlcihTTV9Ud2l0dGVyX3VzZXIgIT0gIiIpDQoNCnRva2VuIDwtIGdldF90b2tlbigpDQp0b2tlbg0KDQphbGxlX3R3ZWV0cyA8LSBsaXN0KCkNCnVzZXJJZExpc3QgPSBsaXN0KFR3aXR0ZXJfYWNjb3VudHMkU01fVHdpdHRlcl91c2VyKQ0KcmwgPC0gcmF0ZV9saW1pdCh0b2tlbiwgInN0YXR1c2VzL3VzZXJfdGltZWxpbmUiKQ0KZm9yKHVzZXIgaW4gdXNlcklkTGlzdFtbMV1dKXsNCiAgYWxsZV90d2VldHNbW3VzZXJdXSA8LSBnZXRfdGltZWxpbmUodXNlciwgbiA9IDIsIGNoZWNrID0gRikNCiAgcHJpbnQoInJhdGUgbGltaXQgcmVtYWluaW5nOiIsIHN0cihybCRyZW1haW5pbmcpKQ0KICBwcmludCgiYXQgdXNlcjoiLCBzdHIodXNlcikpDQogIHJsIDwtIHJsICU+JQ0KICAgIG11dGF0ZShyZW1haW5pbmcgPSByZW1haW5pbmcgLSAxKQ0KICAjIGlmIHJhdGUgbGltaXQgZXhoYXVzdGVkLCB0aGVuIHdhaXQgdG8gcmF0ZSBsaW1pdCByZXNldA0KICBpZiAocmwkcmVtYWluaW5nID09IDVMKSB7DQogICAgcmwgPC0gcmF0ZV9saW1pdCh0b2tlbiwgInN0YXR1c2VzL3VzZXJfdGltZWxpbmUiKQ0KICAgIHByaW50KCJyYXRlIGxpbWl0IGV4Y2VlZGVkLCB3YWl0aW5nIGZvciA5MDBzIGF0IHVzZXIiLCBzdHIodXNlcikpDQogICAgU3lzLnNsZWVwKGFzLm51bWVyaWMocmwkcmVzZXQsICJzZWNzIikpDQogIH0NCn0NCg0KIyMjIE5hY2ggcmVsZXZhbnRlbiBIYXNodGFncyBmaWx0ZXJuIA0KDQoqICJhbGxlX3R3ZWV0cy5yZHMiIGlzdCBkaWUgRGF0ZWkgbWl0IGFsbGVuIGdlem9nZW5lbiBUd2VldHMuDQoqIG5hY2ggcmVsZXZhbnRlbiBUd2VldHMgZmlsdGVybiBtaXQgdm9yaGVyIGJlc3RpbW10ZW4gSGFzaHRhZ3MgKCJUd2l0dGVyLUhhc2h0YWdzLnhsc3giKSwgVHdlZXRzIGluIEtsZWluc2NocmVpYnVuZyBmb3JtYXRpZXJlbiB1bmQgYWxzICJmaW5hbF90d2VldHMucmRzIiBleHBvcnRpZXJlbi4gDQpgYGB7cn0NCmFsbGVfdHdlZXRzIDwtIHJlYWRfcmRzKCJEYXRhL2FsbGVfdHdlZXRzLnJkcyIpDQoNCnN1Y2hiZWdyaWZmZSA8LSByZWFkX2V4Y2VsKCJEYXRhL1R3aXR0ZXItSGFzaHRhZ3MueGxzeCIsIHNoZWV0ID0iVGFiZWxsZTIiKQ0KDQpzdWNoYmVncmlmZmVfdmVjdG9yIDwtIHN1Y2hiZWdyaWZmZSRIYXNodGFncw0KDQphbGxlX3R3ZWV0cyA8LSBiaW5kX3Jvd3MoYWxsZV90d2VldHMpDQoNCmFsbGVfdHdlZXRzIDwtIGFsbGVfdHdlZXRzICU+JSANCiAgbXV0YXRlKHRleHQgPSB0b2xvd2VyKHRleHQpKQ0KDQpmaWx0ZXJ0X3R3ZWV0cyA8LSBhbGxlX3R3ZWV0cyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHRleHQsIHBhc3RlIChzdWNoYmVncmlmZmVfdmVjdG9yLCBjb2xsYXBzZSA9ICJ8IikpKQ0KDQp3cml0ZV9yZHMoZmlsdGVydF90d2VldHMsICJmaW5hbF90d2VldHMucmRzIikNCmBgYA0KDQoNCg0KDQojIFNlbnRpbWVudGFuYWx5c2UNCg0KKiBuYWNoIGRlbiAiZ3Jvw59lbiIgUGFydGVpZW4gZmlsdGVybg0KKiBhbGxlIFBvbGl0aWtlcippbm5lbiBlbnRmZXJuZW4sIHdlbGNoZSBrZWluZW4gVHdpdHRlcmFjY291bnQgYmVzaXR6ZW4NCiogVXNlcm5hbWVzIGluIEtsZWluc2NocmVpYnVuZyBmb3JtYXRpZXJlbg0KYGBge3J9DQpQYXJsYW1lbnRhcmllcl9zZW50aSA8LSBQYXJsYW1lbnRhcmllciAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJCSVciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJTU1ciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJCVkIvRlciKSAlPiUgDQogIGZpbHRlcihQYXJ0ZWkhPSJGVyIpICU+JSANCiAgZmlsdGVyKFBhcnRlaSE9ImZyYWt0aW9uc2xvcyIpICU+JSANCiAgZmlsdGVyKFNNX1R3aXR0ZXJfdXNlciAhPSAiIikgJT4lIA0KICBzZWxlY3QoTmFtZSwgUGFydGVpLCBTTV9Ud2l0dGVyX3VzZXIsIEdlc2NobGVjaHQpICU+JSANCiAgbXV0YXRlKFNNX1R3aXR0ZXJfdXNlcj10b2xvd2VyKFNNX1R3aXR0ZXJfdXNlcikpDQpgYGANCg0KKiBDRFUgJiBDU1Ugc293aWUgRkRQICYgRFZQIHp1c2FtbWVuZsO8Z2VuIA0KYGBge3J9DQpQYXJsYW1lbnRhcmllcl9zZW50aSRQYXJ0ZWlbUGFybGFtZW50YXJpZXJfc2VudGkkUGFydGVpID09ICJDU1UiXSA8LSAiQ0RVL0NTVSINClBhcmxhbWVudGFyaWVyX3NlbnRpJFBhcnRlaVtQYXJsYW1lbnRhcmllcl9zZW50aSRQYXJ0ZWkgPT0gIkNEVSJdIDwtICJDRFUvQ1NVIg0KUGFybGFtZW50YXJpZXJfc2VudGkkUGFydGVpW1BhcmxhbWVudGFyaWVyX3NlbnRpJFBhcnRlaSA9PSAiRkRQL0RWUCJdIDwtICJGRFAiIA0KYGBgDQoNCiogU2VudGlXUyBpbXBvcnRpZXJlbiwgdW0gcG9zaXRpdmUgdW5kIG5lZ2F0aXZlIFfDtnJ0ZXIgenUga2xhc3NpZml6aWVyZW4NCiogTGlzdGUgenVyIFNlbnRpbWVudGFuYWx5c2UgaXN0IHZvbiBVbml2ZXJzaXTDpHQgTGVpcHppZzogImh0dHBzOi8vd29ydHNjaGF0ei51bmktbGVpcHppZy5kZS9kZS9kb3dubG9hZCINCmBgYHtyfQ0KbG9hZCgiRGF0YS9zZW50aVdTLlJEYXRhIikNCnNlbnRpd3MgPC0gZGljdGlvbmFyeShsaXN0KHBvc2l0aXZlPXBvc2l0aXZlLCBuZWdhdGl2ZT1uZWdhdGl2ZSkpDQpgYGANCg0KKiBDb3JwdXMgYXVzIGRlbiBUZXh0ZW4gZGVyIGdlZmlsdGVydGVuIFR3ZWV0cyBiaWxkZW4NCmBgYHtyfQ0KdHdlZXRfY29ycHVzIDwtIGNvcnB1cyhmaWx0ZXJ0X3R3ZWV0cywgdGV4dF9maWVsZCA9ICJ0ZXh0IikNCmBgYA0KDQoqIHRva2VuaXNpZXJlbiBkZXIgVGV4dGUgdW5kIGJpbGRlbiBlaW5lciBERk0NCiogc2VudGl3cyB1bmQgIlR3ZWV0LVRva2VucyIgenVzYW1tZW5mw7xocmVuLCBzb3dpZSBuYWNoIHNjcmVlbl9uYW1lIGdydXBwaWVyZW4NCmBgYHtyfQ0KdG9rZW4gPC0gdG9rZW5zKHR3ZWV0X2NvcnB1cykNCmRmbSA8LSBkZm0odG9rZW4pDQoNCnNlbnRpIDwtIGRmbV9sb29rdXAoZGZtLCBzZW50aXdzKSAgDQpzZW50aSA8LSBkZm1fZ3JvdXAoc2VudGksIGdyb3VwcyA9IHNjcmVlbl9uYW1lKQ0KYGBgDQoNCiogREZNIHp1bSBEYXRhZnJhbWUga29udmVydGllcmVuDQoqIGRvY19pZCBpbiBLbGVpbnNjaHJlaWJ1bmcgZm9ybWF0aWVyZW4NCiogUGFybGFtZW50YXJpZXJfc2VudGkgam9pbmVuDQoqIEdydXBwaWVyZW4gbmFjaCBQYXJ0ZWkNCiogU2VudGltZW50IGRlciBlaW56ZWxuZW4gVXNlcippbm5lbiBhdWYgUGFydGVpZWJlbmUgenVzYW1tZW5mYXNzZW4gdW5kIFZlcmjDpGx0bmlzIHBvc2l0aXZlL25lZ2F0aXZlIGJpbGRlbg0KYGBge3J9DQpzZW50aV9mcmFtZSA8LSBzZW50aSAlPiUgDQogIHF1YW50ZWRhOjpjb252ZXJ0KHRvID0gImRhdGEuZnJhbWUiKSAlPiUgDQogIGFzX3RpYmJsZSgpICU+JSANCiAgbXV0YXRlKGRvY19pZD10b2xvd2VyKGRvY19pZCkpDQoNCnNlbnRpX2ZpbmFsX2ZyYW1lIDwtIHNlbnRpX2ZyYW1lICU+JSANCiAgZnVsbF9qb2luKFBhcmxhbWVudGFyaWVyX3NlbnRpLCBieT1jKCJkb2NfaWQiPSJTTV9Ud2l0dGVyX3VzZXIiKSkgJT4lIA0KICBncm91cF9ieShQYXJ0ZWkpICU+JSANCiAgc3VtbWFyaXNlKGFjcm9zcyhjKG5lZ2F0aXZlLCBwb3NpdGl2ZSksIH5yb3VuZChzdW0oLiwgbmEucm0gPSBUUlVFKS9zdW0obmVnYXRpdmUgKyBwb3NpdGl2ZSwgbmEucm0gPSBUUlVFICksIGRpZ2l0cyA9IDIpKSkNCmBgYA0KDQojIyMgQmFyY2hhcnQgenVtIFNlbnRpbWVudCBkZXIgVHdlZXRzDQoNCiogUGFydGVpIGFic3RlaWdlbmQgbmFjaCBuZWdhdGl2ZW0gU2VudGltZW50IHNvcnRpZXJlbg0KKiBCZXNjaHJpZnR1bmcgZGVyIFgtIHVuZCBZIFdlcnRlIMOkbmRlcm4NCiogQmFyY2hhcnQgYmlsZGVuIHVuZCBpbiBnZ3Bsb3RseSBrb252ZXJ0aWVyZW4NCmBgYHtyfQ0Kc2VudGlfYmFyIDwtIHNlbnRpX2ZpbmFsX2ZyYW1lICU+JSANCiAgbXV0YXRlKFBhcnRlaSA9IGZjdF9yZW9yZGVyKFBhcnRlaSwgcG9zaXRpdmUsIG1heCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGMocG9zaXRpdmUsIG5lZ2F0aXZlKSwgdmFsdWVzX3RvID0gYygiVmVyaMOkbHRuaXMiKSwgbmFtZXNfdG8gPSBjKCLDhHXDn2VydW5nIikpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9iYXIoYWVzKFBhcnRlaSwNCiAgICAgICAgICAgICAgIFZlcmjDpGx0bmlzLCAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgZmlsbCA9IMOEdcOfZXJ1bmcpLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJzdGFjayIsDQogICAgICAgICAgIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNmNDY2NjYiLCAiIzhFQzlCQiIpKSArIA0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgbGFicygNCiAgICB0aXRsZSA9ICLDhHXDn2VydW5nZW4gZGVyIFBvbGl0aWtlcippbm5lbiBhdWYgVHdpdHRlciB6dW0gVGhlbWEgJ0dlbmRlciciLA0KICAgIHN1YnRpdGxlID0gIkVpbnNjaMOkdHp1bmcgZHVyY2ggU2VudGltZW50YW5hbHlzZSIsDQogICAgeCA9ICJQYXJ0ZWkiLA0KICAgIHkgPSAiVmVyaMOkbHRuaXMiLA0KICAgIGZpbGwgPSAiw4R1w59lcnVuZyINCiAgKQ0KDQpmaW5hbF9zZW50aV9wbG90IDwtIGdncGxvdGx5KHNlbnRpX2JhcikNCmZpbmFsX3NlbnRpX3Bsb3QNCmBgYA0KIyBTZW50aW1lbnQtQW5hbHlzZSB2b24gVHdlZXRzIHp1bSBUaGVtYSBHZW5kZXINCg0KQWxzIEdydW5kbGFnZSBmw7xyIGRpZSBoaWVyIHZpc3VhbGlzaWVydGUgU2VudGltZW50LUFuYWx5c2UgZGllbmVuIFR3ZWV0cywgd2VsY2hlIHZvbiBBYmdlb3JkbmV0ZW4gZGVyIExhbmR0YWdlIHVuZCBkZXMgQnVuZGVzdGFnZXMgenVtIFRoZW1hIEdlbmRlciBhYmdlc2V0enQgd3VyZGVuLiBNaXQgZGllc2VyIFNlbnRpbWVudC1BbmFseXNlIGxpZcOfIHNpY2ggZXJtaXR0ZWxuLCBvYiBkaWVzZSBUd2VldHMgZWhlciBwb3NpdGl2IG9kZXIgZWhlciBuZWdhdGl2IHZlcmZhc3N0IHNpbmQuIERhZsO8ciB3dXJkZSBlaW4gV8O2cnRlcmJ1Y2ggZWluZ2VzZXR6dCwgd2VsY2hlcyBuZWdhdGl2IHVuZCBwb3NpdGl2IGtvbm5vdGllcnRlIFdvcnRlIHVuZCDDhHXDn2VydW5nZW4gaW5rbHVzaXZlIEdld2ljaHR1bmdlbiBiZWluaGFsdGV0LiBEaWVzZXMgd3VyZGUgbWl0IGRlbiBUd2VldHMgYWJnZWdsaWNoZW4uIERhcyBFcmdlYm5pcyB6ZWlndCwgd2llIGhvY2ggZGVyIEFudGVpbCBuZWdhdGl2ZXIgdW5kIHBvc2l0aXZlciDDhHXDn2VydW5nZW4gaXN0LiANCg0KVW0gZGllcyB1bXp1c2V0emVuLCB3dXJkZW4genVuw6RjaHN0IG1pdGhpbGZlIGRlcyBEQm9lUy1EYXRlbnNhdHplcyBhbGxlIEFiZ2VvcmRuZXRlbiBhdXNnZXfDpGhsdCwgZGllIMO8YmVyaGF1cHQgZWluZW4gVHdpdHRlci1BY2NvdW50IGJlc2l0emVuLiANCg0KQW5zY2hsaWXDn2VuZCB3dXJkZW4gdm9uIGRpZXNlbiBOdXR6ZXI6aW5uZW4gamV3ZWlscyBkaWUgbGV0enRlbiAxLjAwMCBUd2VldHMgaGVydW50ZXJnZWxhZGVuLiBEaWVzZSB3dXJkZW4gYXVmIDQ3IEhhc2h0YWdzIGdlZmlsdGVydCwgd2VsY2hlIHZvcmhlciBmZXN0Z2VsZWd0IHd1cmRlbiwgdW0gZGFzIFRoZW1hIEdlbmRlciBhYnp1YmlsZGVuICh6LkIuICNnZW5kZXJzdGVybmNoZW4sICNnZW5kZXJnYWdhLCAjZXF1YWxwYXlkYXkgZXRjLikqLiBFcyB3dXJkZSBkYXJhdWYgZ2VhY2h0ZXQsIGRhc3Mgc293b2hsIHBvc2l0aXZlIGFscyBhdWNoIG5lZ2F0aXZlIEhhc2h0YWdzIGVpbmJlem9nZW4gd2VyZGVuLCB1bSBtw7ZnbGljaHN0IGFsbGUgTWVpbnVuZ2VuIGbDvHIgZGllIEFuYWx5c2UgZWluYmV6aWVoZW4genUga8O2bm5lbi4gIA0KDQpEaWUgc28gZ2VmaWx0ZXJ0ZW4gVHdlZXRzIHd1cmRlbiBkYW5uIHp1IGVpbmVtIENvcnB1cyB6dXNhbW1lbmdlZmFzc3QuIE1pdCBkaWVzZW0gQ29ycHVzIHd1cmRlIGVpbmUgU2VudGltZW50LUFuYWx5c2UgZHVyY2hnZWbDvGhydCwgd29iZWkgZGVyIFdvcnRzY2hhdHog4oCeU2VudGlXU+KAnCogZGVyIFVuaXZlcnNpdMOkdCBMZWlwemlnIGFscyBHcnVuZGxhZ2UgZGllbnRlLiBBbnNjaGxpZcOfZW5kIHd1cmRlIG5hY2ggZGVuIGVpbnplbG5lbiBQYXJ0ZWllbiBncnVwcGllcnQgdW5kIGRlciBwYXNzZW5kZSBUZWlsIGRlcyBDb3JwdXMgKGplIG5hY2ggUGFydGVpenVnZWjDtnJpZ2tlaXQgZGVzIG9kZXIgZGVyIHR3ZWV0ZW5kZW4gQWJnZW9yZG5ldGVuKSBpbmtsdXNpdmUgQW5hbHlzZWVyZ2VibmlzIHp1Z2VvcmRuZXQuICANCipodHRwczovL3dvcnRzY2hhdHoudW5pLWxlaXB6aWcuZGUvZGUvZG93bmxvYWQgDQoNCkRpZSBFcmdlYm5pc3NlIGRlciBBbmFseXNlIHNpbmQgaW4gZGVyIFZpc3VhbGlzaWVydW5nIHp1IGVya2VubmVuLiBEaWUgQWJnZW9yZG5ldGVuIHZvbiBkZXIgQWZEIHVuZCB2b24gRGllIExpbmtlIGhhYmVuIGdlbWVpbnNhbSBkZW4gaMO2Y2hzdGVuIEFudGVpbCBuZWdhdGl2ZXIgVHdlZXRzIHZlcmZhc3N0LCBqZXdlaWxzIGRpZSBIw6RsZnRlIHd1cmRlIGFscyBuZWdhdGl2IGF1c2dld2VydGV0LiBEZXIgZ2VyaW5nc3RlIG5lZ2F0aXZlIFRlaWwgd3VyZGUgYmVpIGRlciBDRFUvQ1NVIGZlc3RnZXN0ZWxsdC4gDQoNClp1IGJlYWNodGVuIGlzdCwgZGFzcyBhdXMgZGVyIFNlbnRpbWVudC1BbmFseXNlIG5pY2h0IGhlcnZvcmdlaHQsIG9iIGJlaXNwaWVsc3dlaXNlIG5lZ2F0aXYgw7xiZXIgZGllIEdsZWljaGJlaGFuZGx1bmcgZGVyIEdlc2NobGVjaHRlciBnZXNjaHJpZWJlbiB3aXJkIG9kZXIgbmVnYXRpdiBkYXLDvGJlciwgZGFzcyBlcyBub2NoIGtlaW5lIEdsZWljaGJlaGFuZGx1bmcgZ2lidC4gRGVyIGdlbmF1ZSBJbmhhbHQgZGVzIFR3ZWV0cyBibGVpYnQgdW5iZWFjaHRldC4gU29taXQgbMOkc3N0IHNpY2ggaGllciBuaWNodCBhYmxlc2VuLCBvYiBkaWUgQWJnZW9yZG5ldGVuIGRlciBQYXJ0ZWllbiBqZXdlaWxzIGbDvHIgR2VzY2hsZWNodGVyZ2xlaWNoaGVpdCBwbMOkZGllcmVuIG9kZXIgZGFnZWdlbi4gR2VyYWRlIGFtIEVyZ2VibmlzIHZvbiBBZkQgdW5kIERpZSBMaW5rZSB3aXJkIGRpZXMgZGV1dGxpY2gsIGRhIGRpZSBFaW5zdGVsbHVuZ2VuIGJlesO8Z2xpY2ggZGVzIFRoZW1hcyB0cm90eiBnbGVpY2h3ZXJ0aWdlbSBFcmdlYm5pcyBow7ZjaHN0d2FocnNjaGVpbmxpY2ggdmVyc2NoaWVkZW4gc2luZC4gDQoNCipMaXN0ZSBhbGxlciBnZXN1Y2h0ZW4gSGFzaHRhZ3M6ICNnZW5kZXJwYXlnYXAsICNnZW5kZXJlcXVhbGl0eSwgI3dvbWVuZW1wb3dlcm1lbnQsICNmZW1pbmlzbSwgI2ZlbWluaXNtdXMsICNnZW5kZXJnYWdhLCAjZ2VuZGVyLCAjc2V4aXNtdXMsICNHZWVuYU9uR2VuZGVyLCAjZ2VuZGVyaW5nLCAjZ2VuZGVyc3ByYWNoZSwgI2dlbmRlcmVxdWl0eSwgI2dsZWljaGJlcmVjaHRpZ3VuZywgI2ZyYXVlbnBvd2VyLCAjZnJhdWVucmVjaHRlLCAjZnJhdWVuYmV3ZWd1bmcsICNldmVyeWRheXNleGlzbSwgI2ZpZ2h0c2V4aXNtLCAjc2V4aXNtLCAjbm9tZWFuc25vLCAjQWludE5vQ2luZGVyZWxsYSwgI05pVW5hTWVub3MsICNOaVVuYU1hcywgI015U3RlYWx0aHlGcmVlZG9tLCAjZXF1YWxwYXksICNmZW1hbGVlbXBvd2VybWVudCwgI2dlbmRlcnN0ZXJuY2hlbiwgI21hbnNwcmVhZGluZywgI2dlbmRlcm4sICNtZW5hcmV0cmFzaCwgI2dlbmRlcnNwcmVjaCwgI2dlbmRlcnZlcmJvdCwgI2dlbmRlcnNoaXQsICNlcXVhbHBheWRheSwgI3dvbWVuc2RheSwgI3dlbHRmcmF1ZW50YWcsICNpbnRlcm5hdGlvbmFsd29tZW5zZGF5LCAjZnJhdWVudGFnLCAjZ2VuZGVyZ2VyZWNodGVzcHJhY2hlLCAjZ2VuZGVycG9saXplaSwgI2ZlbWFsZWhlcm8sICNnZW5kZXJzY2h3YWNoc2lubiwgI2dlYmFsbHRlckZlbWluaXNtdXMsICNnZXNjaGxlY2h0ZXJ3YWhuLCAjZ2VzY2hsZWNodGVyd2FobnNpbm4sICNmcmF1ZW4sICNtw6RubmVyIA0KDQoNCg0KDQoNCg0KIyBOZXR6d2Vya2FuYWx5c2UgZGV1dHNjaGVyIFBvbGl0aWtlcippbm5lbiB6dW0gVGhlbWEgR2VuZGVyIGF1ZiBUd2l0dGVyIA0KDQoqIGZpbHRlcnRfdHdlZXRzICJ2ZXJrbGVpbmVybiIgdW5kIGluIHR3ZWV0c19uZXR3b3JrIHNwZWljaGVybg0KKiBzY3JlZW5fbmFtZSBpbiBLbGVpbnNjaHJlaWJ1bmcgZm9ybWF0aWVyZW4NCmBgYHtyfQ0KdHdlZXRzX25ldHdvcmsgPC0gZmlsdGVydF90d2VldHMgJT4lIA0KICBzZWxlY3Qoc2NyZWVuX25hbWUsDQogICAgICAgICByZXR3ZWV0X3NjcmVlbl9uYW1lLA0KICAgICAgICAgY3JlYXRlZF9hdCkgDQpgYGANCg0KKiBQYXJsYW1lbnRhcmllciBEYXRhZnJhbWUgbWl0IHR3ZWV0c19uZXR3b3JrIGpvaW5lbiwgdW0gS2xhcmFtZW4gdW5kIFBhcnRlaXp1Z2Vow7ZyaWdrZWl0IGRlciBQb2xpdGlrZXIqaW5ubmVuIHp1IGJla29tbWVuDQpgYGB7cn0NCnBhcmxhbWVudGFyaWVyX25ldHdvcmsgPC0gUGFybGFtZW50YXJpZXIgJT4lIA0KICBzZWxlY3QoTmFtZSwNCiAgICAgICAgIFBhcnRlaSwNCiAgICAgICAgIFNNX1R3aXR0ZXJfdXNlcikgJT4lIA0KICBkcm9wX25hKFNNX1R3aXR0ZXJfdXNlcikgJT4lIA0KICByZW5hbWUoInNjcmVlbl9uYW1lIiA9ICJTTV9Ud2l0dGVyX3VzZXIiKQ0KDQpuZXR3b3JrX2RhdGEgPC0gcGFybGFtZW50YXJpZXJfbmV0d29yayAlPiUgDQogIGxlZnRfam9pbih0d2VldHNfbmV0d29yaywgYnkgPSAic2NyZWVuX25hbWUiKQ0KYGBgDQoNCiogSMOkdWZpZ2tlaXQgZGVyIFR3ZWV0cyB6dW0gVGhlbWEgYmVyZWNobmVuIA0KKiBIw6R1Zmlna2VpdCB6dSBuZXR3b3JrX2RhdGEgam9pbmVuDQpgYGB7cn0NCmhhdWVmaWdrZWl0X3R3ZWV0cyA8LSBuZXR3b3JrX2RhdGEgJT4lIA0KICBjb3VudChzY3JlZW5fbmFtZSkNCg0KbmV0d29ya19kYXRhIDwtIG5ldHdvcmtfZGF0YSAlPiUgDQogIGxlZnRfam9pbihoYXVlZmlna2VpdF90d2VldHMsIGJ5ID0gInNjcmVlbl9uYW1lIikNCmBgYA0KDQoqIFZla3RvciBkZXIgc2NyZWVuX25hbWVzIGFsbGVyIFBvbGl0aWtlcippbm5lbiBlcnN0ZWxsZW4NCiogcmV0d2VldF9zY3JlZW5fbmFtZSBhdWYgZGllc2Ugc2NyZWVuX25hbWVzIGZpbHRlcm4sIHVtICJGcmVtZHVzZXIqaW5uZW4iIGF1c3p1c2NobGllw59lbiANCmBgYHtyfQ0Kc2NyZWVuX3N1Y2hlIDwtIHBhcmxhbWVudGFyaWVyX25ldHdvcmskc2NyZWVuX25hbWUNCg0KZmlsdGVyZWRfcmV0d2VldGVycyA8LSBuZXR3b3JrX2RhdGEgJT4lIA0KICBmaWx0ZXIocmV0d2VldF9zY3JlZW5fbmFtZSAlaW4lIHNjcmVlbl9zdWNoZSkNCmBgYA0KDQoqIE5ldHogbWl0IHJlbGV2YW50ZW4gV2VydGVuIGRlZmluaWVyZW4gbWl0OiANCiogRWRnZXMgPSB2b24gc2NyZWVuX25hbWUgenUgcmV0d2VldF9zY3JlZW5fbmFtZQ0KKiBOb2RlcyA9IFBvbGl0aWtlcippbm5lbiAoc2NyZWVuX25hbWUgdW5kIHJldHdlZXRfc2NyZWVuX25hbWUpIA0KKiBKb2luZSBhdWZzIE5ldHogUGFydGVpenVnZWjDtnJpZ2tlaXQsIEtsYXJuYW1lbiB1bmQgSMOkdWZpZ2tlaXQgZGVyIFR3ZWV0cyB6dW0gVGhlbWEgKG4pDQpgYGB7cn0NCm5ldHogPC0gZmlsdGVyZWRfcmV0d2VldGVycyAlPiUgDQogIGZpbHRlcighaXMubmEocmV0d2VldF9zY3JlZW5fbmFtZSkpICU+JSANCiAgc2VsZWN0KGZyb20gPSBzY3JlZW5fbmFtZSwgdG8gPSByZXR3ZWV0X3NjcmVlbl9uYW1lKSAlPiUgDQogIGFzX3RibF9ncmFwaA0KDQpuZXR6IDwtIG5ldHogJT4lIA0KICBtdXRhdGUoDQogICAgZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUobW9kZSA9ICJpbiIpLCANCiAgICBjb21wb25lbnQgPSBncm91cF9jb21wb25lbnRzKCkNCiAgKSAlPiUgDQogIGxlZnRfam9pbihuZXR3b3JrX2RhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoTmFtZSwgc2NyZWVuX25hbWUsIFBhcnRlaSwgbikgJT4lIGRpc3RpbmN0KHNjcmVlbl9uYW1lLCAua2VlcF9hbGwgPSBUKSwNCiAgICAgICAgICAgIGJ5ID0gYyggIm5hbWUiID0ic2NyZWVuX25hbWUiKSkgDQpgYGANCg0KKiBGYXJiZW4gZsO8ciBQYXJ0ZWllbiBkZWZpbmllcmVuDQpgYGB7cn0NCnBhcnRlaV9mYXJiZW4gPC0gbGlzdCgNCiAgIkNEVSIgPSAiYmxhY2siLA0KICAiU1BEIiA9ICJyZWQiLA0KICAiQ1NVIiA9ICJibGFjayIsDQogICJGRFAiID0gIiNlMmIwMDciLA0KICAiR1LDnE5FIiA9ICIjMDdDMjNGIiwNCiAgIkxJTktFIiA9ICIjZGU0YzhhIiwgDQogICJBZkQiID0gImJsdWUiDQopDQpgYGANCg0KIyMgTmV0endlcmsNCg0KWnV3ZWlzdW5nIHZvbiBBdHRyaWJ1dGVuIGFuIE5vZGVzOg0KKiBQYXJ0ZWl6dWdlaMO2cmlna2VpdCBpbiBGYXJiZQ0KKiBLbGFybmFtZSBkZXIgUG9saXRpa2VyKmlubmVuIGFscyBMYWJlbCANCiogQW56YWhsIGRlciBUd2VldHMgaW4gR3LDtsOfZQ0KYGBge3J9DQpuZXR6X3Bsb3QgPC0gbmV0eiAlPiUgDQogIGZpbHRlcihjb21wb25lbnQgPD0gMTApICU+JSAgDQogIGdncmFwaChsYXlvdXQgPSAiZnIiKSArDQogIGdlb21fZWRnZV9saW5rKGVkZ2VfY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMjUsIGVkZ2Vfd2lkdGggPSAwLjEsIGVuZF9jYXAgPSBjaXJjbGUoMi41LCAibW0iKSwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDIuNSwgIm1tIiksIGVuZHMgPSAgImxhc3QiLCB0eXBlID0gImNsb3NlZCIpKSArDQogIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IG4sIGNvbG9yID0gUGFydGVpKSkgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhcnRlaV9mYXJiZW4pICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwgOCkpICsgDQogIHRoZW1lX2dyYXBoKGJhY2tncm91bmQgPSAid2hpdGUiKSArDQogIGdlb21fbm9kZV9sYWJlbChhZXMoZmlsdGVyID0gbiA+PSA0MCwgbGFiZWwgPSBOYW1lKSwgcmVwZWwgPSBULCBzaG93LmxlZ2VuZCA9IEYsIGFscGhhID0gMC41KSArDQogIGxhYnModGl0bGUgPSAiUmV0d2VldC1OZXR6d2Vya2UgZGV1dHNjaGVyIFBvbGl0aWtlcippbm5lbiIsIHNpemUgPSAiQW56YWhsIFR3ZWV0cyIsIHN1YnRpdGxlID0gInp1bSBUaGVtYSAnR2VuZGVyJyBhYiAyMDE2IikNCmBgYA0KYGBge3J9DQpuZXR6X3Bsb3QNCmBgYA0KDQojIFJldHdlZXQtTmV0endlcmtlIGRldXRzY2hlciBQb2xpdGlrZXIqaW5uZW4genVtIFRoZW1hIEdlbmRlcg0KDQpVbSBkaWUgQWt0aXZpdMOkdCBlaW56ZWxuZXIgUG9saXRpa2VyKmlubmVuIHVuZCBpaHJlIFZlcm5ldHp1bmcgdW50ZXJlaW5hbmRlciBpbiBEZWJhdHRlbiwgRGlza3Vzc2lvbmVuLCBNZWludW5nc8OkdcOfZXJ1bmdlbiB1bmQgU3RlbGx1bmduYWhtZW4genVtIFRoZW1hIEdlbmRlciBhdWYgVHdpdHRlciBhYnp1YmlsZGVuLCB3dXJkZSBzb3dvaGwgZGllIGluZGl2aWR1ZWxsZSBBbnphaGwgZGVyIFR3ZWV0cyB6dW0gVGhlbWEgYWxzIGF1Y2ggaWhyZSBnZWdlbnNlaXRpZ2UgQmV6dWduYWhtZSBhdWZlaW5hbmRlciBpbiBGb3JtIHZvbiBSZXR3ZWV0cyB1bnRlcnN1Y2h0LiBEaWVzZSBJbmZvcm1hdGlvbmVuIHd1cmRlbiBpbiBlaW5lbSBOZXR6d2Vya2RpYWdyYW1tIGRhcmdlc3RlbGx0LiANCg0KRGllIHNvIGVudHN0YW5kZW5lbiBSZXR3ZWV0LU5ldHp3ZXJrZSB3dXJkZW4gYXVzIGRlbiBsZXR6dGVuIDEuMDAwIFR3ZWV0cyBkZXJqZW5pZ2VuIEFiZ2VvcmRuZXRlbiwgd2VsY2hlIMO8YmVyIGVpbmVuIFR3aXR0ZXItQWNjb3VudCB2ZXJmw7xnZW4gdW5kIHNpY2ggaW4gZGllc2VuIGxldHp0ZW4gMS4wMDAgVHdlZXRzIG1pbmRlc3RlbnMgZWlubWFsIHp1bSBUaGVtYSBHZW5kZXIgw6R1w59lcnRlbiwgZ2VuZXJpZXJ0LiBEZXIgw6RsdGVzdGUgbWl0ZWluYmV6b2dlbmUgVHdlZXQgenVtIFRoZW1hIHd1cmRlIGltIEF1Z3VzdCAyMDE2IGFiZ2VzZXR6dC4gRGVubm9jaCBkZWNrdCBkaWVzZSBOZXR6d2Vya2FuYWx5c2UgbmljaHQgZGllIFR3aXR0ZXItQWt0aXZpdMOkdCBhbGxlciB1bnRlcnN1Y2h0ZW4gUG9saXRpa2VyKmlubmVuIGJpcyB6dXLDvGNrIHp1IGRpZXNlbSBaZWl0cHVua3QgYWIuIEdydW5kIGhpZXJmw7xyIGlzdCwgZGFzcyBlaW5pZ2UgUG9saXRpa2VyOmlubmVuLCBnZW1lc3NlbiBhbiBkZXIgRnJlcXVlbnosIGluIGRlciBzaWUgVHdlZXRzIGFic2V0emVuLCBlaW5lIHZlcmdsZWljaHN3ZWlzZSBob2hlIEFrdGl2aXTDpHQgYXVmIFR3aXR0ZXIgYXVmd2Vpc2VuLCB3ZXN3ZWdlbiBpaHJlIGxldHp0ZW4gMS4wMDAgVHdlZXRzIG5pY2h0IGJpcyBpbiBkZW4gQXVndXN0IDIwMTYgenVyw7xja3JlaWNoZW4uICANCg0KRGllIFB1bmt0ZSBpbiBkZXIgR3JhZmlrIHN0ZWxsZW4gZWluemVsbmUgQWJnZW9yZG5ldGUgZGFyLiBEaWUgR3LDtsOfZSBkZXMgamV3ZWlsaWdlbiBQdW5rdGVzIHZlcmFuc2NoYXVsaWNodCBkaWUgQW56YWhsIGRlciB2b24gZGVyL2RlbSBBYmdlb3JkbmV0ZW4gYWJnZXNldHp0ZW4gVHdlZXRzIHp1bSBUaGVtYSBHZW5kZXIgdW5kIGdpYnQgc29taXQgQXVmc2NobHVzcyDDvGJlciBlaW5lIGV2ZW50dWVsbGUgU2Nod2VycHVua3RzZXR6dW5nIGRlci9kZXMgQWJnZW9yZG5ldGVuLiBadXPDpHR6bGljaCB3dXJkZW4gZGllIE5hbWVuIGRlciBBYmdlb3JkbmV0ZW4gbWl0IDQwIHVuZCBtZWhyIFR3ZWV0cyB6dW0gVGhlbWEgZWluZ2VibGVuZGV0LiBFaW5lIFZlcmJpbmR1bmcgendpc2NoZW4gendlaSBQdW5rdGVuIHN0ZWxsdCBlaW5lbiBUd2VldCBkYXIsIGRlciBnZXJldHdlZXRldCB3dXJkZS4gRGFiZWkgZW50c3ByaW5ndCBkZXIgUGZlaWwgYmVpIGRlci9kZW0gcmV0d2VldGVuZGVuIEFiZ2VvcmRuZXRlbiB1bmQgd2Vpc3QgYXVmIGRpZS9kZW4gQWJnZW9yZG5ldGVuLCB2b24gZGVyL2RlbSBkZXIgb3JpZ2luw6RyZSBUd2VldCBzdGFtbXQuIEdlaGVuIG1laHJlcmUgUGZlaWxlIHZvbiBlaW5lbSBQdW5rdCBhdXMsIGhhdCBkZXIvZGllIGVudHNwcmVjaGVuZGUgQWJnZW9yZG5ldGUgbWVocmVyZSBUd2VldHMgYW5kZXJlciBBYmdlb3JkbmV0ZXIgZ2VyZXR3ZWV0ZXQuIFdlaXNlbiBtZWhyZXJlIFBmZWlsZSBhdWYgZWluZW4gUHVua3QsIHNvIHd1cmRlIGRlci9kaWUgZW50c3ByZWNoZW5kZSBBYmdlb3JkbmV0ZSBtZWhyZmFjaCB2b24gYW5kZXJlbiBBYmdlb3JkbmV0ZW4gZ2VyZXR3ZWV0ZXQuIFp3aXNjaGVuIHp3ZWkgUHVua3RlbiBrYW5uIG1laHIgYWxzIGVpbmUgVmVyYmluZHVuZyBiZXN0ZWhlbi4gRGllIEZhcmJlIGRlciBQdW5rdGUgc3ltYm9saXNpZXJ0IGRpZSBQYXJ0ZWl6dWdlaMO2cmlna2VpdCBkZXIgQWJnZW9yZG5ldGVuLiAgDQoNCkluIGRlciBHcmFmaWsgc2luZCBtZWhyZXJlIG5pY2h0IG1pdGVpbmFuZGVyIHZlcmJ1bmRlbmUgTmV0endlcmtzdHJ1a3R1cmVuIHp1IGVya2VubmVuLiBTaW5kIFB1bmt0ZSBpbiBrZWluZXIgV2Vpc2UgZHVyY2ggVmVyYmluZHVuZ3NsaW5pZW4gbWl0ZWluYW5kZXIgdmVya27DvHBmdCwgc28gbmVobWVuIGRpZSBBYmdlb3JkbmV0ZW4gaW4gaWhyZW4gZW50c3ByZWNoZW5kZW4gVHdlZXRzIGtlaW5lbiBCZXp1Zywgb2RlciB6dW1pbmRlc3Qga2VpbmVybGVpIEJlenVnIGluIEZvcm0gdm9uIFJldHdlZXRzLCBhdWZlaW5hbmRlci4gIA0KDQpEYXMgVmVyaMOkbHRuaXMgZGVyIGVpbnplbG5lbiBOZXR6d2Vya2UgenVlaW5hbmRlciBpc3QgZGFoZXIgZm9sZ2VuZGVybWHDn2VuIHp1IGJlc2NocmVpYmVuOiBad2FyIGvDtm5uZW4gZGllIG5pY2h0IG1pdGVpbmFuZGVyIHZlcmtuw7xwZnRlbiBLb21tdW5pa2F0aW9uc2tldHRlbiBkZW4gZ2xlaWNoZW4gQW5sYXNzIHp1bSBUaGVtYSBoYWJlbiwgd2VpbCBzaWUgei5CLiBpbiBkZXIgZ2xlaWNoZW4gRGViYXR0ZSBlbnRzdGFuZGVuIHNpbmQgKG9obmUgZGFzcyBkYWJlaSBWZXJrbsO8cGZ1bmdlbiBkdXJjaCBSZXR3ZWV0cyBlbnRzdGFuZGVuIHNpbmQpLCBzaWUga8O2bm5lbiBqZWRvY2ggYXVjaCB6dSBhbmRlcmVuIFplaXRwdW5rdGVuIHVuZCBBbmzDpHNzZW4gZW50c3RhbmRlbiBzZWluLCB3b21pdCBzaWUgaW4ga2VpbmVtIGRpcmVrdGVuIFp1c2FtbWVuaGFuZyB6dWVpbmFuZGVyIHN0w7xuZGVuLiBXYXMgc2llIHZlcmJpbmRldCwgaXN0IGRhc3Mgc2llIGRhcyBLb21tdW5pa2F0aW9uc3ZlcmhhbHRlbiB1bmQgZGllIFZlcm5ldHp1bmdzc3RydWt0dXJlbiB2b24gQnVuZGVzdGFncy0gdW5kIExhbmR0YWdzYWJnZW9yZG5ldGVuIGF1ZiBUd2l0dGVyIHp1bSBUaGVtYSBHZW5kZXIsIHdlbGNoZXMgZHVyY2ggZGllIDQ3IFN1Y2hiZWdyaWZmZSAoc2llaGUgU2VudGltZW50YW5hbHlzZSkgZXJzY2hsb3NzZW4gd3VyZGUsIGRhcnN0ZWxsZW4uICANCg0KRXMgZsOkbGx0IGF1ZiwgZGFzcyBBYmdlb3JkbmV0ZSBkZXIgUGFydGVpZW4gR3LDvG5lIHVuZCBEaWUgTGlua2UgYmVzb25kZXJzIHN0YXJrIGluIGRlbiBOZXR6d2Vya3N0cnVrdHVyZW4gdmVydHJldGVuIHNpbmQuIEbDvHIgYWxsZSBQYXJ0ZWllbiBpc3QgZmVzdHp1c3RlbGxlbiwgZGFzcyBkaWUgQWJnZW9yZG5ldGVuIHNpY2ggenVtIEdyb8OfdGVpbCBwYXJ0ZWlpbnRlcm4gcmV0d2VldGVuIHVuZCB2b20gUmV0d2VldGVuIEFiZ2VvcmRuZXRlciBhbmRlcmVyIFBhcnRlaWVuIGVoZXIgYWJzZWhlbi4gRGFiZWkgc3RlY2hlbiBlcm5ldXQgZGllIFBhcnRlaWVuIEdyw7xuZSB1bmQgRGllIExpbmtlIGR1cmNoIGVpbmUgZXR3YXMgc3TDpHJrZXJlIMO8YmVycGFydGVpbGljaGUgVmVybmV0enVuZyBiZXNvbmRlcnMgdW50ZXJlaW5hbmRlciBoZXJ2b3IuIEF1Y2ggQWJnZW9yZG5ldGUgZGVyIENEVSBuZWhtZW4gdmVyZWluemVsdCBCZXp1ZyBhdWYgQWJnZW9yZG5ldGUgYW5kZXJlciBQYXJ0ZWllbi4gV29iZWkgc293b2hsIGJlaSBpaHIgYWxzIGF1Y2ggYmVpIGRlciBTUEQgZGllIHZlcmjDpGx0bmlzbcOkw59pZyBnZXJpbmdlIFByw6RzZW56IGluIGRlciBTdW1tZSBkZXIgTmV0endlcmtlIGF1ZmbDpGxsdC4gQmVpIEZEUCB1bmQgQWZEIGhpbmdlZ2VuIGbDpGxsdCBkaWUgSXNvbGF0aW9uIGlocmVyIE5ldHp3ZXJrZSB2b20gUmVzdCBkZXIgTmV0endlcmtzdHJ1a3R1cmVuIGF1Zi4gV8OkaHJlbmQgZGllIEZEUCBkYWJlaSBqZWRvY2ggdmVyaMOkbHRuaXNtw6TDn2lnIHN0YXJrZSBpbm5lcnBhcnRlaWxpY2hlIFZlcmtuw7xwZnVuZ2VuIGF1ZndlaXN0LCBzaW5kIGRpZSBOZXR6d2Vya2UgZGVyIEFmRCBlaGVyIHZvbmVpbmFuZGVyIGlzb2xpZXJ0LiANCg0KIyBadXNhbW1lbmZhc3N1bmcgZGVyIEVyZ2Vibmlzc2UgDQoNClp1c2FtbWVuZmFzc2VuZCBoYXQgZGllIEFuYWx5c2UgZ2V6ZWlndCwgZGFzcyBlcyBlaW5lIERpc2tyZXBhbnogendpc2NoZW4gZGVyIHJlYWxlbiBHZXNjaGxlY2h0ZXJ2ZXJ0ZWlsdW5nIGluIGRlciBHZXNlbGxzY2hhZnQgdW5kIGRlciBWZXJ0ZWlsdW5nIGluIGRlciBSZXByw6RzZW50YXRpb24gZHVyY2ggZGllIEFiZ2VvcmRuZXRlbiBnaWJ0LiAgDQoNCkF1Y2ggaW5uZXJoYWxiIGRlciBQYXJ0ZWllbiBzcGllbHQgZGFzIFRoZW1hIEdlbmRlciBlaW5lIHVudGVyc2NoaWVkbGljaCBncm/Dn2UgUm9sbGUuIERpZSBGcmFrdGlvbmVuIGRlciBQYXJ0ZWllbiBHcsO8bmUgdW5kIERpZSBMaW5rZSBoYWJlbiBkZW4gdmVyaMOkbHRuaXNtw6TDn2lnIGdyw7bDn3RlbiBGcmF1ZW5hbnRlaWwuIEluIGRlciBOZXR6d2Vya2FuYWx5c2UgemVpZ3Qgc2ljaCwgZGFzcyBlYmVuZmFsbHMgZGllc2UgYmVpZGVuIFBhcnRlaWVuIHNlaHIgYWt0aXYgYW4gZGVtIFRoZW1hIGJldGVpbGlndCBzaW5kLiAgDQoNCkRpZSBTZW50aW1lbnQtQW5hbHlzZSBoYXQgZ2V6ZWlndCwgZGFzcyBzaWNoIGRpZSBGcmFrdGlvbmVuIEFmRCB1bmQgRGllIExpbmtlIHp1IDUwJSBuZWdhdGl2IHVuZCA1MCUgcG9zaXRpdiB6dSBkZW0gVGhlbWEgYXVmIFR3aXR0ZXIgw6R1w59lcm4uIERpZSBhbmRlcmVuIGbDvG5mIFBhcnRlaWVuIG1lbGRlbiBzaWNoIGVoZXIgcG9zaXRpdi4gIA==